雜湊,桶排序

2021-08-16 23:40:15 字數 2496 閱讀 5150

理想的雜湊結構不過是乙個包含關鍵字的具有固定大小的陣列,雜湊表的長度是資料結構的一部分。雜湊中的關鍵字不需要支援比較大小,只要能夠支援判等操作就行了。每個關鍵字按照乙個雜湊函式被對映到0到tablesize-1範圍內的桶單元。當不同的關鍵字被對映到相同的單元時,稱作衝突(conflict)。雜湊的插入,查詢,刪除都是常數時間複雜度。

常見的雜湊方法有除餘法hash(key)=key%m,字串為key時也常對字元求和作為雜湊值。

雜湊表的值為乙個指向鍊錶節點的指標,當對應的桶單元被占用時,將對應的值插入到對應的鍊錶中(比如插入到鍊錶的

頭結點),這種方式節省空間,刪除操作簡單,但是需要動態的申請節點記憶體,影響速度,並且空間分布不連續,系統快取

失效,i/o次數增多。

//結構定義

struct listnode;

typedef struct listnode* position;

struct hashtbl;

typedef struct hashtbl *hashtable;

hashtable initializetable(int tablesize);

void destroytable(hashtable h);

position find(elementtype key,hashtable h);

void insert(elementtype key,hashtable h);

elementtype retrieve(position p);

struct listnode

typedef position list;

struct hashtbl

//initializetable()

hashtable initializetable(int tablesize)

int i=0;

for(i;ithelist[i]=malloc(sizeof(struct listnode));

if(h->thelist[i]==null)

else

}}//find()

position find(elementtype key,hashtable h)

return start;

}//insert()

void insert(elementtype key,hashtable h)

else}}

線性試探指的是,當發生雜湊衝突時,從當前位置出發,逐一的往前試探,直到找到乙個空的位置。

其優點是空間在初始時就分配好,無需動態分配,提高了效率,並且由於資料臨近,具有良好的區域性性,充分利用了系統的io效能,但是會導致更多的衝突。插入時若新詞條尚不存在,則存入直接查詢終止處的空桶,若存在,則往後逐一試探,直至找到空桶。刪除時由於存在查詢鏈,直接清除命中的桶會導致隨後的查詢鏈被切斷,因此可做惰性刪除。

以平方數為距離,確定下乙個試探桶單元。

只有當表長為素數,切裝填因子不超過0.5時,才一定能找出乙個空桶。

從衝突位置開始,依次向後試探。

桶排序適用於元素分布範圍固定,元素分布隨機的情況,例如下面是輸入最小值,最大值,和雜湊長度進行桶排序的**,每個通採用鍊錶組織,桶內部用stl裡面list的sort()函式。

vectorbucketsort(vectorivec,int min_elem,int max_elem,int bucketsize)

int perbucket = (max_elem - min_elem )/ bucketsize + 1;

for (int j = 0; j < ivec.size();++j)

for (int k = 0; k < bucketsize;++k)

deletebuckettbl;

return sortedvec;

}int main()

; copy(input_vec.begin(), input_vec.end(), ostream_iterator(std::cout, " "));

vectorsorted_vec = bucketsort(input_vec, 11,130,11);

cout << endl;

copy(sorted_vec.begin(), sorted_vec.end(), ostream_iterator(std::cout, " "));

system("pause");

return 0;

}

桶排序適用於當輸入範圍有限,並且輸入值隨機分布的情況,是最耗費空間的排序方法,但是能獲得線性的複雜度。

雜湊(二)雜湊桶

雜湊桶又被稱作開鏈法,開雜湊法。相比於閉雜湊法雜湊桶更為靈活直觀,存資料時不會浪費空間,開雜湊法存資料時由於避免雜湊衝突,總會有百分之三十的空間浪費,當儲存空間很大時將會造成大量的浪費。同時開雜湊法造成雜湊衝突時不便於查詢資料。所以我們有了雜湊結構中的雜湊桶。雜湊桶與開雜湊法一樣的是需要開一段陣列用...

雜湊拉鍊法(雜湊桶)

昨天寫了雜湊的開放定址法的部落格,今天我們要說的是拉鍊法,還有乙個名字叫雜湊桶。雜湊桶要做的就是,之前我們用的開放定址法,通過將資料對映到陣列中來實現雜湊。這裡每個陣列的位置只能存放乙個資料,如果衝突的話會繼續往下找找到空的位置然後放進去,但是其實大家都能感覺出來上乙個 很簡單,也很扯,感覺實現起來...

HashTable雜湊表 雜湊表(雜湊桶)

處理雜湊衝突的開鏈法 拉鍊法 雜湊桶 使用素數做雜湊表的長度,可以降低雜湊衝突 素數表size t getnextprime size t num 素數表 雜湊桶的節點的定義 template struct hashnode 在插入前檢查容量,以及負載因子。不夠就進行增容,按素數表進行增,以減小雜湊...