哈希表的实现(取余法)
? ? 哈希表,又叫散列表,它可以提供快速的插入查找操作,對于大規模數據的查找時間空間效率會很高。哈希表構造方式有多種,其中取余法在比賽中最常用。
? ? 如果讀入很多值非常大的數,讓你判斷一些數是否出現過。如果用桶來記錄,空間開不了那么大。如果排序后來查,時間效率又低。但可以通過hash優化解決這個問題。
? ? 取余法簡單地說,就是給每個數mod一個合適的值X,得到的余數放在數組中下標與其一致的位置,由于X不會很大,且余數不會超過數X,數組的大小在0..X-1范圍內,不會超空間,如果查某個數,將這個數mod X后在直接在數組中找到。
? ? 但是這樣一些不同數據會出現在同一個地址上,比如說X=5,13 mod X=3,18 mod 5=3,這兩個數(13,18)便產生了沖突。
? ? 為了解決沖突,可以使用掛鏈的形式,將沖突數據像掛鏈一樣掛在同一位置,將13放在5的位置,將18掛在13后面,如果要查18,先18 mod 5=3 找到3的位置,先看3位置掛鏈上的第一個數是13,不等于18,繼續往后面找,直到找到18,如果找不到,說明沒有出現,按要求輸出即可。我們可以發現,這樣的存儲方式很像(或者就是)鏈表的存儲方式,所以我們可以使用鏈表來處理“掛鏈”的部分。這樣查找的問題就解決了。
? ? ?經分析可以得知,hash表查找時間最好為O(1),最差為O(n),由于O(n)情況對于比賽的數據一般不會出現,如果選擇了合適的X值,時間效率會非常好。
? ? ?如何選擇X值呢,通常是選一個較大但不會使數組超空間的質數。?
具體實現:
初始化
typehash=^node;node=recorddx:int64;next:hash;end; View Code?
插入操作
procedure put(x:int64); var q:hash;xx:int64; beginxx:=x mod maxn;//maxn就是那個適當的正整數Xnew(q);q^.dx:=x; q^.next:=a[xx];a[xx]:=q; end; View Code查找操作
function find(x:int64):boolean; var p:hash; beginxx:=x mod maxn;new(p);p:=a[xx];while p<>nil dobeginif p^.dx=x then exit(true);p:=p^.next;end;exit(false); end; View Code??????
?
轉載于:https://www.cnblogs.com/qtyytq/p/4265759.html
總結
以上是生活随笔為你收集整理的哈希表的实现(取余法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git 入门操作
- 下一篇: 四层负载均衡——LVS