開鏈式雜湊表

2021-08-30 21:47:44 字數 2483 閱讀 3177

hashtable適用於需要頻繁插入、刪除、查詢的場合、在這些場合中hashtable都可以常數平均時間完成、然而之所以hashtable的效率這麼高、是因為在以上這些操作時都是通過hash function直接定位元素在表中的位置然後直接操作。不可避免的有一些部分性質或全部性質相同的元素被定位到同乙個位置上、這時新的問題產生了:解決衝突。實際上解決方法有很多:像線性探測、二次探測、開鏈。

線性探測和二次探測實現方法非常相似、線性探測:如果定位的位置已經被佔據、那麼就 pos+ 1 向下乙個位置檢視、直到找到乙個空位置為止(在表中迴圈查詢)。二次探測:如果位置pos已經被使用、那麼下乙個檢視位置就是pos + 1^2、pos + 2^2、pos + 3^2。

開鏈:每個**維護著乙個list、hashfuction定位到某個list然後、我們在list上進行插入刪除操作。雖然針對list而進行的查詢是一種線性操作、但是如果list足夠短、效率還是很高的。

使用二次探測、如果假設**大小為質數(為了減小衝突使用質數、開鏈法不需要)、而且保證元素個數不得超過桶個數的一半(如果超過就重新配置**)、那麼就可以確定每插入乙個新元素所需的探測次數不超過2次。

雖然hashtable在許多操作上效率都很高、但是這也取決於hash函式、如果開鏈的hashtable、所有元素都在同乙個鍊錶上、那麼查詢效率就成了o(n)。

下面是使用hashtable開鏈法實現的set

#ifndef hashtable_h

#define hashtable_h

#include #include #include #include using namespace std;

//開鏈式 hashtable

class hashtable final

}; typedef functionff; //函式型別提供給foreach使用

vectortable; //存放每個「桶」的頭指標

unsigned bucket_count; //桶數量

unsigned element_count; //目前表中元素數量

public:

hashtable(unsigned n):table(prime(n),null),bucket_count(0),

element_count(0)

~hashtable()

private:

unsigned prime(unsigned n) //根據提供需要的「桶」個數、轉換為稍大一些的質數

}return primes[prime_count - 1];

} unsigned bucket_num(int val,unsigned num) //找到當前元素val應該放在桶數為num時的哪乙個桶中

void resize(unsigned element_num) //重新調整表的長度(桶的數量)

}table.swap(t);

bucket_count = new_bucket_num;

} }public:

bool insert(int val); //插入元素

bool erase(int val); //刪除元素

void foreach(ff f); //用於測試的foreach

void release(); //釋放空間

unsigned qbuckets(); //得到桶數目

unsigned qelements(); //得到元素數目

};const unsigned int hashtable::primes[prime_count] =

;bool hashtable::insert(int val)

bool hashtable::erase(int val)

for(list* obj = table[index];obj && obj->next; obj = obj->next)

} return false;

}void hashtable::foreach(ff f) }}

void hashtable::release()

table[i] = null;

} element_count = 0; }}

unsigned hashtable::qbuckets()

unsigned hashtable::qelements()

#endif

rb_tree保證在插入、刪除、查詢的時間複雜度都是log(n)、而hashtable操作的時間複雜度是常數級的、但是hash function的耗時也要考慮。

rb_tree是有序的、hashtable是無序的。

一般情況hashtable所消耗記憶體空間較大。

雜湊表(開雜湊)

hash table2.h pragma once include define hashmaxsize 1000 typedef int keytype typedef int valtype typedef size t hashfunc keytype key typedef struct h...

雜湊表 開雜湊

開雜湊很簡單。asl的計算忘了,找了兩道題都沒算對,這才是我不寫的真正原因 裡是裝13用的 include using namespace std 雜湊表 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關 鍵碼值對映到表中乙...

雜湊表 開雜湊

開雜湊 首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中。負載因子a不超過0.5 如果超出必須考慮增容 struct hashbucknode 結點 hashbucknode,pha...