Hash課堂筆記

2022-02-24 21:32:48 字數 1715 閱讀 7202

hash就是吧乙個字母對映成乙個數字(樹,圖,字串都可對映)

通過對映的 hash值 進行比較。

在對映 hash值 可能會發生衝突,即不同字串對映成一樣的\(hash\)值。失效。

對於字串來說,我們常把字串看成k進製數(k>26,k為質數!!),然後對乙個大指數取摸,餘數就是此字串的 hash值 。

有時也用自然溢位為代價加快效率。

先預設要模的大質數位進製;

ll base = 131;

ll mod = 2123400401301379571;

之後對每個字串進行hash預處理運算

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

hs[i] = (hs[i-1] * base+idx(s[i]))%mod;//idx(sp[i]):第s[i]個字元所對映的數字

預處理\(\ power\)陣列, (\(\ power[i]\) 表示當前 \(k\) 進製下,\(k\) 的 \(i\) 次方)

power[0] = 1;

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

\(2345\),我只要 \(345\) ,那麼就需要 \(\)

由上述預處理可知,現在我們雜湊陣列 \(ha\) 中的數分別為

\[\begin

ha[1] & = 2\times10^0 \ 即2\\

ha[2] & = 2 \ \times10^1+3 \ \times10^0 \ 即23\\

ha[3] & = 2 \ \times10^2+3 \ \times10^1+4 \ \times10^0 \ 即234\\

ha[4] & = 2 \ \times10^3+3 \ \times10^2+4 \ \times10^1+5 \ \times10^0\ 即2345\\

\end

\]那麼 \(後三位的字元應該是=2345-2000=345=ha[4]-ha[(2-1)]\times 10^\) ;

同理 \(45 = ha[4] - ha[2]\times 10^\)

那麼 \(k\) 進製數也是如此,因此就有了下面的公式。

// l r 表示需要的區間的字元邊界

int hash_interval(int l,int r)

\[\begin

ha[1] & = 1\times29^0(1) \\

ha[2] & = 1 \ \times29^1+2 \ \times29^0(12) \\

ha[3] & = 1 \ \times29^2+2 \ \times29^1+3 \ \times29^0(123)\\

ha[4] & = 1 \ \times29^3+2 \ \times29^2+3 \ \times29^1+4 \ \times29^0(1234)\\

...\\

\end

\]\[\begin

ha[3-4]& = ha[4]-ha[2]\times29^2(34) \\

&=1234-1200(12\times 29^2)\\

& = 34

\end

\]注:我是用10進製進行舉例,方便~

sqlplus課堂筆記

desc user tables select from user tables where table name emp update 表名 set 列名 修改後資料 where 行名 aaa create table student id number 5,2 primary key,sname...

linux課堂筆記

rw r r 第一位有 d,l 表示普通檔案,d表示目錄,l表示連線檔案 快捷方式 接下來三位為一組,分別表示u所有者,g所屬組,o其他人。r讀,w寫,x執行 代表acl許可權 數字代表引用計數 開頭的檔案代表隱藏檔案 系統檔案 ls l簡稱ll就是ls的詳細資訊 建立目錄 mkdir make d...

課堂筆記六

偵錯程式 gdb 程式除錯工具 使用 gcc g test.c o test gdb test gdb run 執行程式 gdb list 檢視 gdb quit 退出 gdb break 21 執行到21行 gdb next 單步執行 gdb print 變數名 檢視變數數 gdb continu...