演算法導論11 3

2022-07-07 15:36:18 字數 1523 閱讀 5980

本小節介紹了雜湊表的靈魂--雜湊函式

乙個好的雜湊函式應滿足簡單均勻雜湊假設:每個關鍵字都被等可能地雜湊到\(m\)個槽位中的任何乙個,並與其他關鍵字已雜湊到哪個槽位無關。

雖然上述假設難以實現,但是可以作為衡量其他雜湊函式的標準。

有一些動態集合的元素關鍵字並不是自然數,我們需要使用各種各樣的方法將其變為自然數,以便進行雜湊;

說是除法,但實際上進行的卻是取模操作,具體函式如下

\[h(k) = k \;mod\; m

\]其中\(m\)的取值有一些講究,應當避免為\(2\)的冪;其取值應該為乙個不太接近\(2\)的整數冪的素數。

有兩個步驟:

用關鍵字\(k\)乘以常數\(a(0,並提取\(ka\)的小數部分;

用\(m\)乘以這個小數,再向下取整;

具體函式如下:

\[h(k) = \lfloor m(ma \;mod\; 1)\rfloor

\]乘法雜湊法的乙個優點就是對\(m\)的選擇不是特別關鍵,一般選擇它為\(2^p\)。

事實上,我覺得全域雜湊法不能被稱為雜湊方法,應該是一種雜湊策略;

全域雜湊法在執行之前,從一組雜湊函式中通過隨機演算法選出一種作為雜湊演算法,然後進行雜湊;

假設我們希望查詢乙個長度為\(n\)的鍊錶,其中每乙個元素都包含乙個關鍵字\(k\)並具有雜湊值\(h(k)\)。每乙個關鍵字都是長字串。那麼在表中查詢具有給定關鍵字的元素時,如何利用各元素的雜湊值呢?

對鍊錶中每乙個元素,先比較該元素與待查關鍵字的雜湊值。若一樣,在比較字串值。

假設將乙個長度為\(r\)的字串雜湊到\(m\)個槽中,並將其視為乙個以\(128\)為基數的數,要求應用除法雜湊法。我們可以很容易地把數\(m\)表示為乙個\(32\)位的機器字,但對長度為\(r\)的字串,由於它可以被當作以\(128\)為基數的數來處理,就要占用若干機器字。假設應用除法雜湊表來計算乙個字元的雜湊值,那麼如何才能在除了該串本身占用的空間外,只利用常數個機器字?

題目本身講的有點繞,請參考這裡

考慮除法雜湊法的另乙個版本,其中\(h(k)= k \; mod \; m, m = 2^p -1\),\(k\)為按基數\(2^p\)表示的字串。試證明:如果串\(x\)可由串\(y\)通過自身字元置換排列匯出,則\(x\)和\(y\)具有相同的雜湊值。給出乙個應用的例子,其中這一特性在雜湊函式中不希望出現的。

不會證明,但是這道題的出現說明需要注意\(m\)的取值;

考慮乙個大小為\(m=1000\)的雜湊表和乙個對應的雜湊函式\(h(k) = \lfloor m (ka \;mod \;1)\),其中\(a=(\sqrt -1)/2\),嘗試計算關鍵字\(61,62,63,64,65\)被對映到的位置。

k

h(k)

61700

62318

63936

64554

65172

翻譯 11 3 泛型演算法

泛型演算法 標頭檔案宣告了一組全域性模板函式,這些函式實現了作用在容器上的基本演算法。這些函式中的多數使用stl風格迭代器。stl標頭檔案提供更完整的泛型演算法集合。這些演算法可以被用在qt容器上以及stl容器上。如果在你的所有平台上stl實現可用,當qt缺少乙個相同的演算法的時候,那麼可能沒有理由...

演算法導論 隨機演算法

一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...

《演算法導論》 演算法導論2 2 1插入排序

2.1 插入排序。我們分析的第乙個演算法是插入排序演算法,輸入 n個數 a1,a2,a3,a4,a5,a6,a7 an 輸出 序列的乙個排列 即重新排序 a1 a2 a3 使a1 a2 a3 插入排序演算法的偽 是以乙個過程的形式給出的,稱為insertion sort,它的引數是乙個陣列。包括了n...