關鍵:不比較關鍵碼,直接搜尋得到需要的數。
特點:與搜尋樹不一樣,雜湊結構元素的儲存位置與關鍵碼直接對應,可以不用進行比較遍歷。
如圖,建立乙個陣列,把a[4]中的資料按特定的規則儲存到相應的位置,比如a[i]%n,到時候搜尋資料的時候可以按照同樣的規律直接找到這個位置,如果這個位置有數,則存在。
比如按照特定方式處理資料,不同資料處理得到的結果可能相同,這樣就都指向同乙個儲存位置。
閉雜湊解決
儲存時,如果該位置有資料,則往下乙個位置儲存,如果後面還有衝突,則一直往後面找,直到找到空處,儲存下來。讀取時,如果處理得到的位置有資料,但是不是想要的數,則一直往後面找,直到找到為止,如果遇到了空處還沒找到,則沒有儲存過該數。
具體**介面實現
#pragma once
#include
#include
#include
#include
typedef
int keytype;
typedef
int valuetype;
enum status
;typedef
struct hashnode
hashnode;
typedef
struct hashtable
hashtable;
size_t hashfunc(keytype key, size_t n) //算位置
void hashtableinit(hashtable* ht) //初始化
int hashtableinsert(hashtable* ht, keytype key, valuetype value) //插入
; if (ht->table == null)
tail = ((ht->_size) * 10 )/ (ht->n);
if (tail >= 7)
hashnode* newtable = (hashnode*)malloc(sizeof(hashnode)*n);
assert(newtable);
memset(newtable, 0, n);
for (i = 0; i < ht->n; i++)
newtable[index]._key = ht->table[i]._key;
newtable[index]._value = ht->table[i]._value;
newtable[index]._status = ht->table[i]._status;}}
free(ht->table);
ht->table = newtable;
ht->n = n;
}index = hashfunc(key, ht->n);
while (ht->table[index]._status == exits)
ht->table[index]._key = key;
ht->table[index]._value = value;
ht->table[index]._status = exits;
ht->_size++;
return0;}
hashnode* hashtablefind(hashtable* ht, keytype key) //尋找
return null;
}int hashtableremove(hashtable* ht, keytype key)
else
return -1;
}//static size_t bkdrhash(const char* str);
void hashtabledestory(hashtable* ht)
void hashtableprintf(hashtable* ht)
}printf("\n");
}
開雜湊解決給乙個指標陣列開拓一塊空間,每個元素是乙個指向結點的指標,每個結點都可以儲存資料,有雜湊衝突的資料直接掛在這個結點的下面,就像單鏈表一樣。這樣比閉雜湊更節約空間。
hashnode* buyhashnode(keytype key, valuetype value) //建立結點
size_t hashfunc(keytype key, size_t n) //計算位置
size_t getnextprimenum(size_t cur);
void hashtableinit(hashtable* ht)
int hashtableinsert(hashtable* ht, keytype key, valuetype value)
; if (table == null)
index = hashfunc(key, ht->_n);
ht->_tables[index] = buyhashnode(key, value);
return
0; }
tail = (ht->_size+1)/ (ht->_n);
if (tail == 1) //判滿擴容
hashnode** newtable = (hashnode**)malloc(sizeof(hashnode*)*n);
for (i = 0; i < n; i++)
assert(newtable);
for (i = 0; i < ht->_n; i++) //把舊表的資料複製到新錶
next->_next = cur;
}else
newtable[index] = cur;
}} //for迴圈終止
free(table);
table = null;
ht->_tables = newtable;
ht->_n = n;
} //擴容結束
index = hashfunc(key, ht->_n); //開始插入
if (ht->_tables[index] != null)
cur->_next = buyhashnode(key, value);
}else
ht->_tables[index] = buyhashnode(key, value);
return0;}
hashnode* hashtablefind(hashtable* ht, keytype key)
return null;
}int hashtableremove(hashtable* ht, keytype key)
else
else
parent->_next = null;
}free(cur);
}return0;}
void hashtabledestory(hashtable* ht)}}
free(ht->_tables);
ht->_tables = null;
ht->_n = 0;
ht->_size = 0;
}void hashprint(hashtable* ht)}}
printf("\n");
}
資料結構 雜湊
裝填因子 key的個數與表長的比值。雜湊表查詢成功的平均查詢長度,查詢失敗的平均查詢長度都是期望,期望怎麼求,平均查詢長度就怎麼求。雜湊表這裡有兩種實現方式 線性開型定址雜湊,鍊錶雜湊。1.線性開型定址雜湊 陣列實現,資料個數不大於表長,放乙個元素時,若發生衝突,則順次線性掃瞄直到找到乙個空位。2....
資料結構 雜湊
將元素的儲存位置和該元素的關鍵碼通過某種函式建立一一對應的關係,構造出來的儲存結構稱之為雜湊表,轉換時借助的函式稱之為雜湊函式,在理想情況下,根據關鍵碼搜尋元素時可以不經過任何比較,一次性從表中查詢到所要搜尋的元素 但是在通過雜湊函式進行元素儲存位置確立的時候會出現,不同元素的關鍵碼通過雜湊函式計算...
資料結構 雜湊
目錄 5 雜湊 5.1 定義 5.2 分離鏈結法 5.3 開放定址法 5.3.1 線性探測法 5.3.2 平方探測法 5.3.3 雙雜湊 5.5 再雜湊 5.6 可擴散雜湊 思想 將每個關鍵字對映到從0到tablesize 1的範圍的某個數,並且被放到適當的單元中。難道 衝突的處理。將雜湊到同乙個值...