資料結構 雜湊(一)

2022-08-31 18:24:10 字數 1687 閱讀 3524

二叉樹提供了對一組資料進行各種操作的強大功能,特別是在處理有序資料時二叉查詢樹非常方便。例如findmax和findmin操作,在表資料結構中這兩個操作時間複雜度為o(n),但在二叉查詢樹中這兩個操作只需要o(logn)的時間複雜度。但在很多情況下,資料的順序並不是應用所關心的問題。這一類應用只需要插入,刪除,查詢這些基本的操作,此時使用二叉樹資料結構進行這些操作的時間複雜度也為o(logn),當資料量很大時,這樣的操作非常耗時。為了解決這個問題,提出了一種可以在常數時間複雜度情況下進行插入,刪除和查詢操作的資料結構——雜湊表(hash table)。這種資料結構不支援與順序有關的操作,但是優點在於處理增刪查操作時需要的時間與資料量無關,保證它在資料量很大的情況下依然可以保持高效。

理想情況下的雜湊表就是乙個固定大小的陣列,記表的大小為tablesize,則表中儲存位置的索引變化從0到tablesize-1,其中tablesize也是雜湊表資料結構的一部分,而不只是浮動於全域性的某個變數。關鍵字(要儲存的資料)被對映到這個範圍內的某個數,並且被存放到適當的單元中。所謂的對映就是雜湊,需要雜湊函式的支援。理想情況下雜湊函式可以將不同的關鍵在對映到不同的位置,但實際上這種情況不可能發生,因為關鍵字的數量一般是遠遠大於可以對映到的數值範圍的。這樣就必須處理不同的關鍵字對映到相同的位置的情況,即解決衝突。

如果關鍵字是整數,那麼比較合理的雜湊函式是key mod tablesize,同時tablesize最好是素數,這樣可以保證雜湊結果相對比較均勻。通常情況下,關鍵字是字串,此時需要仔細考慮雜湊函式。下面考慮一種tablesize大小為10007這個素數情況下的雜湊函式選擇:

一種簡單的思路是將字串中各個字元值(字元型也可以看做整型的一種)相加:

typedef unsigned int index;

index hash(const char *key,int tablesize)

unsigned int hashval=0;

while(*key!=』\0』)

hashval+=*key++;

return hashval% tablesize;

這種情況下假設字串長度至多8個字元,因為乙個字元的編碼最大為127,則8個字元的總大小為1016,tablesize為10007,則hash表中只有很少的一部分空間可以被真正的分配,因此這不是一種均勻的分配。另一種思路只使用字串的前三個字元,這樣公有26*26*26=17576個可能的值,在tablesize為10007的情況下分布較為均勻,實現如下:

index hash(const char * key,int tablesize)

return (key[0]+27*key[1]+729*key[2])%tablesize;

但是實際的統計中,字串的前三個字元並不是隨機的,3個字元的組合實際上只有2851種可能。這樣造成這個hash函式的結果也不是均勻分布的。hash的第三種嘗試是考慮字串中的所有字元,利用來計算hash值,實現如下:

index hash(const char *key,int tablesize)

unsigned int hashval=0;

while(*key!=』\0』)

hashval=(hashval<<5)+*key++;

return hashval%tablesize;

其中選擇乘以32的i次冪是因為乘以32等於向左移動5位,速度較快。它替換的是27,表示26個英文本元和乙個null符號。實際證明,這種雜湊函式可以比較好的做到字串的均勻分布。

資料結構 雜湊

裝填因子 key的個數與表長的比值。雜湊表查詢成功的平均查詢長度,查詢失敗的平均查詢長度都是期望,期望怎麼求,平均查詢長度就怎麼求。雜湊表這裡有兩種實現方式 線性開型定址雜湊,鍊錶雜湊。1.線性開型定址雜湊 陣列實現,資料個數不大於表長,放乙個元素時,若發生衝突,則順次線性掃瞄直到找到乙個空位。2....

資料結構 雜湊

關鍵 不比較關鍵碼,直接搜尋得到需要的數。特點 與搜尋樹不一樣,雜湊結構元素的儲存位置與關鍵碼直接對應,可以不用進行比較遍歷。如圖,建立乙個陣列,把a 4 中的資料按特定的規則儲存到相應的位置,比如a i n,到時候搜尋資料的時候可以按照同樣的規律直接找到這個位置,如果這個位置有數,則存在。比如按照...

資料結構 雜湊

將元素的儲存位置和該元素的關鍵碼通過某種函式建立一一對應的關係,構造出來的儲存結構稱之為雜湊表,轉換時借助的函式稱之為雜湊函式,在理想情況下,根據關鍵碼搜尋元素時可以不經過任何比較,一次性從表中查詢到所要搜尋的元素 但是在通過雜湊函式進行元素儲存位置確立的時候會出現,不同元素的關鍵碼通過雜湊函式計算...