引起雜湊衝突的乙個原因可能是:雜湊函式設計不夠合理。
雜湊函式設計原則:
雜湊函式的定義域必須包括需要儲存的全部關鍵碼,而如果雜湊表允許有m個位址時,其值域必須在0到m-1之間
雜湊函式計算出來的位址能均勻分布在整個空間中
雜湊函式應該比較簡單
閉雜湊
typedef int keytype;
typedef int valtype;
enum status//定義狀態
;typedef struct hashnode
hashnode;
typedef struct hashtable
hashtable;
void hashinit(hashtable *ht)//初始化
}size_t getnextprime(size_t cur)//獲取素數n,進行擴容時用到的
; for (size_t i = 0; i < _primesize; ++i) }
return _primelist[_primesize - 1];
}int hashfunc(keytype key,size_t n)//判斷該數在雜湊表的位置
int hashinsert(hashtable *ht,keytype key,valtype val)//開放定址法
newtable[index]._key=ht->_table[i]._key;
newtable[index]._val=ht->_table[i]._val;
newtable[index]._status=ht->_table[i]._status;
} ht->_n=newn;
ht->_table=newtable;
} size_t index=hashfunc(key,ht->_n);//插入
while (ht->_table[index]._status==ex)
++index;
if (index==ht->_n)
}ht->_table[index]._key=key;
ht->_table[index]._val=val;
ht->_table[index]._status=ex;
ht->_size++;
}
hashnode *hashfind(hashtable *ht,keytype key)//開放定址法的尋找
} ++index;
if (index==ht->_n)
}return null;
}int hashremove(hashtable *ht,keytype key)//開放定址法的刪除
return -1;
}
void hashprintf(hashtable *ht)//雜湊表的列印
雜湊(閉雜湊)開放定址法實現
之前一篇博文中提過如何用開鏈法實現雜湊表 這裡是鏈結 那麼對於雜湊表的實現,還有另外一種方法的實現,這就是雜湊開放定址法來實現。該方法也是用來處理雜湊衝突的。解決思想如下 現有關鍵字17,60,29,38 如何確定位址?可以看見該錶的長度為11,那麼使用關鍵字取餘該錶的長度,得到的餘數就是該關鍵字的...
開放定址法實現雜湊表
使用分離鏈結法實現雜湊表時需要額外的空間來儲存指標,而且需要給新單元動態分配空間,導致演算法的速度減慢。開放定址法一次分配表的大小,可以使用線性雜湊,平方雜湊,雙重雜湊等等方法,這些方法除了雜湊函式不相同之外,對於雜湊表的大小要求也不一樣。平方雜湊需要使表的大小是儲存元素的兩倍以上,這樣總能找到空槽...
雜湊衝突處理 開放定址法
設計得再好的雜湊函式也不可能完全避免衝突,這就像我們再健康也只能盡量預防疾病,但卻無法保證永遠不得病一樣,既然衝突不能避免,就要考慮如何處理它。那麼當我們在使用雜湊函式後發現兩個關鍵字key1 key2,但是卻有f key1 f key2 即有衝突時,怎麼辦呢?我們可以從生活中找尋思路。試想一下,當...