雜湊(二)雜湊桶

2021-08-19 23:59:51 字數 1498 閱讀 3692

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

雜湊桶與開雜湊法一樣的是需要開一段陣列用於對映,不過不一樣的是雜湊桶的陣列存的是指標所以雜湊桶是一段指標陣列。陣列中每乙個位置都存著一段鍊錶,當插入資料時不用處理雜湊衝突,直接將資料鏈結在鍊錶即可,雜湊桶的結構如下所示。

雖然雜湊桶不會有雜湊衝突,不過當乙個桶中存在的資料過多時,也會造成查詢的不便。於是我們根據此設計了雜湊桶的負載因子,一般是控制在1左右,即size/n=1。當超過負載因子時進行擴容。

##雜湊桶函式設計

雜湊桶函式設計如下:

首先定義雜湊桶結構體

typedef int valuetype;

typedef struct hashnode

hashnode;

typedef struct hashtable

hashtable;

}

hashnode* buyhashnode(keytype key, valuetype value)

void hashinsertcapacity(hashtable* ht)

} free(ht->_tables);

ht->_n = newht._n;

ht->_tables = newht._tables;

}}

int hashtableinsert(hashtable* ht, keytype key, valuetype value)

cur=cur->_next;

} hashnode* newnode = buyhashnode(key, value);

newnode->_next = ht->_tables[index];

ht->_tables[index] = newnode;

ht->_size++;

return 0;

}

hashnode* hashtablefind(hashtable* ht, keytype key)

} return null;

}

int hashtableremove(hashtable* ht, keytype key)

else

}while (ptr != null)

ptr = ptr->_next;

} return -1;

}

雜湊拉鍊法(雜湊桶)

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

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

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

C 開雜湊雜湊表(雜湊桶)

開雜湊概念 開雜湊法又叫鏈位址法 開鏈法 首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表連線起來,各鍊錶的頭結點儲存在雜湊表中。開雜湊中每個桶中放的都是發生雜湊衝突的元素。節點定義 template class v s...