雜湊表,又叫雜湊表,它可以提供快速的插入查詢操作,對於大規模資料的查詢時間空間效率會很高。雜湊表構造方式有多種,其中取餘法在比賽中最常用。
如果讀入很多值非常大的數,讓你判斷一些數是否出現過。如果用桶來記錄,空間開不了那麼大。如果排序後來查,時間效率又低。但可以通過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值呢,通常是選乙個較大但不會使陣列超空間的質數。
具體實現:
初始化
type
hash=^node;
node=record
dx:int64;
next:hash;
end;
插入操作
procedure put(x:int64);
var q:hash;xx:int64;
begin
xx:=x mod maxn;//maxn就是那個適當的正整數x
new(q);
q^.dx:=x; q^.next:=a[xx];
a[xx]:=q;
end;
查詢操作
function find(x:int64):boolean;
var p:hash;
begin
xx:=x mod maxn;
new(p);
p:=a[xx];
while p<>nil do
begin
if p^.dx=x then exit(true);
p:=p^.next;
end;
exit(false);
end;
除2取餘法
要求 給乙個十進位制數n,求出n二進位制各個數字的和 方法 除以2取餘法,將值相加即可 include using namespace std intmain cout ans endl return0 eg 6 110,有2個1 1023 1111111111,有10個1。如果把每位的數值做標記 ...
資料結構 雜湊表(除留取餘法 鏈位址法)
include using namespace std 雜湊函式的構造方法 除留取餘法 typedef struct node node typedef struct hash table hash table 初始化雜湊表 hash table inithashtable 在雜湊表中查詢資料 no...
線性探查法實現的雜湊表(雜湊表)類
const int defaultsize 100 enum kindofstatus template class hashtable hashtable operator const hashtable rhs bool search const k k1,const e el const bo...