演算法導論 簡單雜湊表的除法實現

2021-09-07 04:49:00 字數 1957 閱讀 3043

雜湊表,又名雜湊表。hashtable。

云云,看似非常高大上,事實上只是是直接定址的延伸而已。直接定址為何物,看乙個陣列:a[10],那麼取當中乙個元素a[1],這就是直接定址,直接去這個a+1的位址上,就找到了這個數值,時間複雜度為o(1)。

而雜湊表的目的就是要讓查詢的時間複雜度盡量往o(1)上靠。

假如有10000個數,比方0~9999,是可能出現的數字的集合,我們如今要將一段時間內,出現的數字,所有儲存起來。假設出現的數字都不反覆的情況下。我們能夠使用乙個長度為10000的陣列a[10000]來儲存。假設數字987出現了。那麼我們直接將其儲存在a[987]元素上,以此類推。當我們要查詢某個數是否出現的時候,比方1002這個數,是否出現。我們能夠直接去找a[1002]。看看值是否是1002,為了保險起見。也能夠在初始化的時候將陣列做-1初始化。這樣。查詢的時間複雜度就是o(1)。

上面的做法感覺是非常快。可是卻有問題。太浪費空間了。還是上面的樣例,假如可能出現的集合為0~9999這一萬個數。可是我們能夠預知,實際會出現的數字僅僅有最多10個。假設依照上面的做法。就須要為查詢這10個數。而花費10000個空間?是不是太奢侈了點?

其次,上面的做法,基礎在於全部出現的陣列。都不反覆,假設我們人品太好,總共出現兩個888怎麼辦?我們又想知道。888出現了幾次?顯然這時候。乙個a[888]空間是不夠的。

為了解決上面兩個問題,分兩步來做:

怎樣壓縮?這裡要用到通常所說的雜湊函式。雜湊函式的作用,就是將大的集合資料,印射到乙個相對較小的,我們能夠接受的集合範圍內。使得速度和記憶體空間達到乙個平衡。比方這裡。0~9999一萬個可能出現的數字集合。而最多實際僅僅會出現10個。我們就能夠使用a%b(取餘)操作來處理,比方這裡,我們能夠使用a%10。來讓全部出現的資料的範圍由0~9999,變成0~9這十個數,然後就能夠使用乙個a[10]的陣列,去搞定直接定址。

像上面說的,出現兩個888怎麼搞?那麼我們在a[888]這個位置上。不放元素。我們將a陣列作為乙個鍊錶陣列,a[888]放鍊錶的位置,這樣,出現兩個888,每次都從鍊錶的頭部插入,這樣就能放的下了。

假設查詢的時候,時間複雜度就不能是單單的o(1)了。我們考慮最壞的情況,比方n個元素的集合,陣列的長度為m。當然(n>m)。這時候,除卻雜湊函式的取餘操作的o(1),還要加上(n/m)的鍊錶長度的查詢,這是在全部位置鍊錶的長度都同樣的情況。假設鍊錶的情況非常極端。。。這就不好了。。

所以依據上面的分析,不難發現,這個雜湊函式(雜湊函式)非常關鍵,最好是能讓資料,平均的分布到各個位置的鍊錶上,而不要集中到乙個或某幾個。由於這樣會造成某乙個鍊錶的長度非常長,那麼查詢起來,時間複雜度就不理想了。

關於雜湊函式(雜湊函式)的取法,有非常多種。這裡就不再討論,以下給出除法(取餘法)的雜湊函式,實現簡單的雜湊表**:

#include using namespace std;

/** * @部落格:

*/struct node ;

struct list

~list()

} void print()

cout << endl;

} void inserthead(int key) else

} node* search(int key)

if (curr == null) else if (pre == null) else

} void deletenode(node* n)

}};//void deletelist(list* l)

// }

//}struct hashtable

//析構

~hashtable()

} }void chained_hash_insert(int key)

node* chained_hash_search(int key)

void chained_hash_delete(node* n)

}};int main()

《演算法導論》雜湊表

雜湊表 hash table 是實現字典操作 查詢 插入 刪除 的有效資料結構,具有很高的查詢效率。一定情況下查詢元素的期望時間是o 1 優於鍊錶 o n 和直接定址的陣列 查詢也是o 1 相當。但當實際儲存的關鍵字數比可能的關鍵字總數小的時候,雜湊錶比陣列有效。一些記號 直接定址,關鍵字k存放在第...

演算法導論 雜湊表

include include includeusing namespace std const int length 6 待插入的數列長度 const int tablesize 11 雜湊表的容量 應該打大於數列長度以保證每個元素都有處可放 typedef struct hash hashtab...

演算法導論 雜湊表

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 9 8 雜湊表 hash table 是一種支援高效插入,查詢,刪除操作的動態集合結構。並且在滿足一些合理假設下,這些操作的平均時間複雜度可以達到 1 這也是雜湊表能夠和二叉搜尋樹 紅黑樹 抗衡的乙個重要方面。一 直接定址表 當關鍵字集合...