今天聽了洛谷的字串課之後,對於自己好好學學字串演算法也有了更大的動力。
但由於比較弱,所以先從最最簡單的乙個開始。
也就是雜湊演算法。
它通過給每個字串賦予乙個「隨機」生成的整數的方法,使得可以用更加快的效率實現字串判重或者匹配字串等等操作。
比如說如果有兩個字串s和s』(長度分別為l和l』),而我們要比較它們是否具有包含關係。
列舉這個公共字串的開頭的話,複雜度是o(ll』)的,對於許多字串題來說都太慢了過不去。
雜湊演算法相當於是把字串表示成乙個k進製數: h(
c)=(
c1km
−1+c
2km−
2+c3
km−3
+...
+cmb
0)mo
dhh (c
)=(c
1km−
1+c2
km−2
+c3k
m−3+
...+
cmb0
)mod
h其中k,h是大於字串長度且互質的質數。
並且有乙個滾動雜湊的優化可以直接將字串匹配的複雜度降到o(l+l』) h(
s[a+
1...a+
m])=
(h(s
[a..
.a+m
−1]∗
k−sa
km+s
a+m)
) h(s
[a
+1...a+
m])=
(h(s
[a..
.a+m
−1]∗
k−sa
km+s
a+m)
)有的,因為不同字串的雜湊值是有一定可能相等的,所以應該用一些奇怪的方法來判斷雜湊值相同的字串到底是不是同乙個字串。(不過我暫時不會qwq)
但是,如果兩個字串的雜湊值不相同,那麼它們一定不是相同的字串!
暫時只會最簡單的。(這是洛谷上面雜湊模版可以ac的**)
#include
#include
#include
#include
using
namespace
std;
typedef
unsigned
long
long ull;
const ull b = 127;//這是個超可愛的數字!並且還是個質數ww
ull mod=212370440130137957ll;//從dalao題解上面抄的大質數
ull h[1505];
ull hashh(char s)
int main()
sort(h+1,h+n+1);
int res=1;
for(int i=2;i<=n;i++)
printf("%d\n",res);
return
0;}
雜湊表與雜湊演算法學習筆記
雜湊表 於陣列具有下標隨機訪問特性,理解這點非常重要。可以說雜湊表是由陣列進化來的。將輸入的鍵通過雜湊函式對映得出的value作為index去table中查詢,這便是雜湊的思想。graph lr a 鍵值key 雜湊函式 b 結果value 我們了解到為什麼雜湊表的查詢複雜度是o 1 因為key v...
雜湊演算法學習
今天學習nosql資料庫的時候,學習到了memcached,但是對於雜湊演算法不太了解,這裡進行學習。什麼是雜湊演算法?把任意的二進位制字元轉換成固定長度的二進位制值得一種演算法。了解雜湊演算法前要了解雜湊表。什麼是雜湊表?也叫做雜湊表,根據key來訪問的一種資料結構 這個key value這個對映...
演算法學習筆記1
1 二分查詢 int arr new int binatsearch arr,12 public static int binatsearch int arr,int a else return 1 使用要求 1 有序 實現思路 1 確定最壞情況沒找到 low height 2 二分查詢 基於最低最...