雜湊 開放定址法

2021-08-15 23:00:04 字數 1702 閱讀 2637

引起雜湊衝突的乙個原因可能是:雜湊函式設計不夠合理。   

雜湊函式設計原則:

雜湊函式的定義域必須包括需要儲存的全部關鍵碼,而如果雜湊表允許有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 即有衝突時,怎麼辦呢?我們可以從生活中找尋思路。試想一下,當...