字串(一) 字串Hash

2021-08-19 09:43:05 字數 847 閱讀 7959

今天開一手最不(tao)擅(yan)長的字串演算法:字串hash演算法。

似乎提到字串的話,kmp應該是更為常見的一種,但是hash有它的優點,被犇們稱為「優雅的暴力」。

何謂hash?hash的中文稱為雜湊,這當然是音譯,直譯過來就是雜湊,或者也有叫預對映的。雜湊的作用就是通過某個特殊函式的對映,將任意長度的輸入對映為固定長度的輸出。而字串雜湊涅,顧名思義當然就是把字串轉換為整數的函式。但是有些時候,這些對映無法做到一一對應,我們稱之為碰撞/衝突,這時候就需要某些手段避免這些碰撞。

字串hash的主要演算法就是「bkdr hash」,其採用了進製壓縮的思想,把字串中的每個字元看成乙個大數每一位上的數字,然後對這個結果取模,我們認為取模後的結果和原來的結果是等價的,這樣就可以在有一定的錯誤率的基礎上進行判斷了。當然也可以寫成unsigned long long,自動對超過範圍的數取模2^64。雜湊的精度不夠的話,還可以使用雙雜湊。

字串雜湊的思想非常簡單,實現起來也很方便。在某些特定的情況下,例如判定字串的重複性的時候,使用字串hash會顯得非常高效。

#include#define inf 0x7ffffff

using namespace std;

char s[1007];

typedef unsigned long long ull;

ull a[20003];

ull base=233;

ull hash()

sort(a,a+n);

int ans=1;

for(int i=1;iif(a[i]!=a[i-1]) ans++;

cout

}

第一字串 Trie Topology

bessie最近在玩字串。她發現通過改變字母的順序可以使一些字串排在其他所有的字串之前 按字典序從小到大排序 比如說,bessie找到了對於字串 omm moo mom 和 ommnom 她可以用標準的字母表把 mom 排在最前面,也可以用字母表 abcdefghijklonmpqrstuvwxyz...

演算法題(一) 字串

public static string submax string strarr else if max k system.out.println max return arrays.copyofrange strarr,start,end 1 給定兩個字串str1,str2。如果兩者字元種類和相...

程式設計之美一 字串

字串是最常見的面試題目型別,應當分配最大的時間。字串本身很簡單,但是相關的題目需要更複雜的演算法來解決。比如說動態規劃,搜尋,等等。include strlen 求字串長度 strcmp 比較2個字串是否一樣 strcat 字串連線操作 strcpy 字串拷貝操作 strncat 字串連線操作 前n...