雜湊表基本操作及其擴充套件

2021-08-16 05:55:58 字數 4263 閱讀 2601

雜湊表的特點:

根據雜湊表的特點可知,雜湊衝突在所難免,雖然可以通過調整雜湊函式來降低雜湊函式的可能性,但還是不能完全避免雜湊衝突,因此提出兩種解決方案:

開雜湊:拉鍊法,首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中(如圖)

刪除

查詢

#include

#include

#include

typedef

enum status

status;

typedef

int keytype;

typedef

int valuetype;

typedef

struct hashnode

hashnode;

typedef

struct hashtable

hashtable;

size_t getnewn(size_t n);//獲取容量

void hashtableinit(hashtable* hash);//初始化

int hashtableinsert(hashtable* hash, keytype key, valuetype value);//插入

size_t hashfunc(size_t n, keytype key);//獲取座標

void hashprint(hashtable* hash);//列印

hashnode* hashtablefind(hashtable* hash, keytype key);//查詢

void hashtableremove(hashtable* hash, keytype key);//刪除

void hashtabledestory(hashtable* hash);//銷毀

void testhash();

size_t getnewn(size_t n)

; size_t i = 0;

for (; i < _primesize; ++i)

}return _primelist[_primesize - 1];

}//初始化

void hashtableinit(hashtable* hash,size_t n)

}size_t hashfunc(size_t n,keytype key )

void isfull(hashtable* hash)

newtable[newindex] = hash->_table[i];

}hash->_n = newn;

free(hash->_table);

hash->_table = newtable;

}}//插入

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

}hash->_table[index]._key = key;

hash->_table[index]._value = value;

++hash->_size;

hash->_table[index]._status = exits;

return0;}

//查詢

hashnode* hashtablefind(hashtable* hash, keytype key)

return null;

}//刪除

void hashtableremove(hashtable* hash, keytype key)

//銷毀

void hashtabledestory(hashtable* hash)

void hashprint(hashtable* hash)

else

if (hash->_table[i]._status == empty)

else

if (hash->_table[i]._status == delete)

}printf("\n\n");

}

#include

#include

#include

#include

typedef

int keytype;

typedef

int valuetype;

typedef

struct hashnode

hashnode;

typedef

struct hashtable

hashtable;

size_t getnextprimenum(size_t n);//空間

void hashtableinit(hashtable* ht);//初始化

size_t hashfunc(size_t n, keytype key);//計算座標

hashnode* buyhashnode(keytype key, valuetype value);//建立節點

hashnode* hashtablefind(hashtable* ht, keytype key);//查詢

int hashtableremove(hashtable* ht, keytype key);//刪除

void hashtableprint(hashtable* ht);//列印

void hashtabledestory(hashtable* ht);//銷毀

void testhashtable();

size_t getnextprimenum(size_t n)

; size_t i = 0;

for (; i < _primesize; ++i)

}return _primelist[_primesize - 1];

}void hashtableinit(hashtable* ht)

size_t hashfunc(size_t n, keytype key)

//建立節點

hashnode* buyhashnode(keytype key, valuetype value)

//插入

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

}ht->_n = newn;

free(ht->_tables);

ht->_tables = newtable;

}//獲取位置

size_t index = hashfunc(ht->_n, key);

hashnode* cur = ht->_tables[index];

while (cur)

cur = cur->_next;

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

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

ht->_tables[index] = node;

++ht->_size;

return0;}

//查詢

hashnode* hashtablefind(hashtable* ht, keytype key)

cur = cur->_next;

}return null;

}//刪除

int hashtableremove(hashtable* ht, keytype key)

else

free(cur);

return

0; }

prev = cur;

cur = cur->_next;

}return -1;

}//銷毀

void hashtabledestory(hashtable* ht)

//列印

擴充套件二(布隆過濾器)

點陣圖和布隆經典例題,可以點下面鏈結

雜湊表(雜湊表)的基本操作

首先要說的是 雜湊表又叫雜湊表 雜湊只是英文hash的音譯,雜湊才是標準的翻譯 好吧,下面是源 如果有錯誤,請見諒!head.h include using namespace std 雜湊表又叫 雜湊表 其實音譯才叫做雜湊 typedef int keytype 元素型別定義 typedef st...

雜湊表基本操作

遍歷雜湊表需要用到dictionaryentry object,如下 for dictionaryentry de in ht ht為乙個hashtable例項 console.writeline de.key 對應於key value鍵值對 key console.writeline de.val...

雜湊表(雜湊表)及其實現

雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。例如 給定表m,存在函式f key 對任意給定的關鍵字值key,代入函...