雜湊演算法概述

2021-08-17 16:34:51 字數 2749 閱讀 8309

雜湊用於字串處理(快速判斷兩個字串是否相同)。先介紹一下雜湊的思想:ab

c=97∗

p2+98

∗p1+

99∗p0

a bc

=97∗p

2+98∗

p1+99

∗p0ab

d=97∗

p2+98

∗p1+

100∗p0

a bd

=97∗p

2+98∗

p1+100∗p

0abcd=97

∗p3+

98∗p2

+99∗p

1+100∗p0

a bc

d=97∗

p3+98

∗p2+

99∗p1

+100∗p

0顯然我們相當於把字串變成乙個p進製的數(稱作這個字串的雜湊值),然後如果這個p進製的數相同就可以確定這兩個字串是相同的。但是我們發現:這個數可能會很大,所以我們只能把這兩個數進行取模,限制在int範圍內。但是由於取模,雜湊值相同的字串不一定相同。不過在模很大的情況下,雜湊值相同,兩個字串是大概率相同的。也就是說,如果只判斷兩個字串,我們只用計算兩個串的雜湊值然後比較是否相同,wa的機率是

1100000000

1

100000000

。但是還有一類問題,我們需要判斷某乙個串是否出現過。有乙個很直接的想法就是把所有雜湊值放到bool陣列中,計算乙個,判斷這個雜湊值是否出現過。但是這個時候精度問題就十分感人。這個時候我們就需要雙雜湊,我們取不同的p和不同的模數,對於乙個串計算兩個雜湊值,如果這兩個同時出現過,那麼也可以判斷這個串出現過了。

雜湊的思想是很簡單的,但是寫法上有技巧(令人窒息,第一次考試寫wa了)。

for(int j=0;j

j++)

for(int j=0;j

j++)

hash=(hash*p+a[j])%mod;

再看一看二維雜湊。

二維雜湊的姿勢要奇怪一點,先把p的次方填滿矩陣:

然後每個格仔乘上該格仔的數,然後求矩陣字首和。之後我們就可以o1查詢每個矩陣的雜湊值(支援加減)。雖然左上角次數不同,我們把所有次數乘成相同的就行。

有雙雜湊判斷是否出現。

時間限制: 1000 ms 記憶體限制: 131072 kb

提交數: 33 通過數: 10

給出乙個 n×

m n×m

的矩陣。讓你從中發現乙個最大的正方形。使得這樣子的正方形在矩陣 中出現了至少兩次。輸出最大正方形的邊長。

第一行兩個整數

n n

,m' role="presentation" style="position: relative;">m

m代表矩陣的長和寬;

接下來

n n

行,每行

m' role="presentation" style="position: relative;">m

m個字元(小寫字母) ,表示矩陣。

輸出乙個整數表示滿足條件的最大正方形的邊長。

5 10

ljkfghdfas

isdfjksiye

pgljkijlgp

eyisdafdsi

lnpglkfkjl

3
對於 30%的資料,n,

m≤100 n,m

≤100

;對於 100%的資料,n,

m≤500 n,m

≤500

。正如上面的方法,附上**:

#include

#include

#include

using

namespace

std;

struct lxyb[250005];

int head[100005];

long

long pr1=97,pr2=233,mod1=94271,mod2=19260819;

int n,m,ans,cnt;

long

long p1[250005],p2[250005];

long

long hash1[505][505],hash2[505][505];

char s[505][505];

void add(int op,int ed)

bool check(int k)

add(has1,has2);

} return

false;

} void er(int l,int r)

int main()

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

er(1,min(n,m));

cout

<

}

雜湊表 Hash Table 雜湊概述

雜湊表支援一種最有效的檢索方法 雜湊。從根來上說,乙個雜湊表包含乙個陣列,通過特殊的索引值 鍵 來訪問陣列中的元素。雜湊表的主要思想是通過乙個雜湊函式,在所有可能的鍵與槽位之間建立一張對映表。雜湊函式每次接受乙個鍵將返回與鍵相對應的雜湊編碼或雜湊值。鍵的資料型別可能多種多樣,但雜湊值的型別只能是整型...

雜湊表概述

基本概念 通過記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f以及處理衝突的方法,使得每個關鍵字和結構中乙個唯一的位置相對應。這樣對於關鍵字k根據對應關係f,就可以得到儲存位置f k 稱這種對應關係f為雜湊函式。與二叉樹不同,雜湊表中儲存的資料是無序的,對於查詢任意資料高效,二叉樹查詢某一範圍...

雜湊表概述

雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表或雜湊表。具體表現為 儲存位置 f key 1.在儲存時,通過雜湊函式計...