1 基本原理
我們使用乙個下標範圍比較大的陣列來儲存元素。可以設計乙個函式(雜湊函式, 也叫做雜湊函式),使得每個元素的關鍵字都與乙個函式值(即陣列下標)相對應,於是用這個陣列單元來儲存這個元素;也可以簡單的理解為,按照關鍵字為每乙個元素"分類",然後將這個元素儲存在相應"類"所對應的地方。
但是,不能夠保證每個元素的關鍵字與函式值是一一對應的,因此極有可能出現對於不同的元素,卻計算出了相同的函式值,這樣就產生了"衝突",換句話說,就是把不同的元素分在了相同的"類"之中。後面我們將看到一種解決"衝突"的簡便做法。
總的來說,"直接定址"與"解決衝突"是雜湊表的兩大特點。
2 函式構造
建構函式的常用方法(下面為了敘述簡潔,設 h(k) 表示關鍵字為 k 的元素所對應的函式值):
a) 除餘法:
選擇乙個適當的正整數 p ,令 h(k ) = k mod p
這裡, p 如果選取的是比較大的素數,效果比較好。而且此法非常容易實現,因此是最常用的方法。
b) 數字選擇法:
如果關鍵字的位數比較多,超過長整型範圍而無法直接運算,可以選擇其中數字分布比較均勻的若干位,所組成的新的值作為關鍵字或者直接作為函式值。
3 衝突處理
線性重新雜湊技術易於實現且可以較好的達到目的。令陣列元素個數為 s ,則當 h(k) 已經儲存了元素的時候,依次探查 (h(k)+i) mod s , i=1,2,3…… ,直到找到空的儲存單元為止(或者從頭到尾掃瞄一圈仍未發現空單元,這就是雜湊表已經滿了,發生了錯誤。當然這是可以通過擴大陣列範圍避免的)。
4 支援運算
雜湊表支援的運算主要有:初始化(makenull)、雜湊函式值的運算(h(x))、插入元素(insert)、查詢元素(member)。
設插入的元素的關鍵字為 x ,a 為儲存的陣列。
初始化比較容易,例如
const empty=maxlongint; // 用非常大的整數代表這個位置沒有儲存元素
p=9997; // 表的大小
procedure makenull;
var i:integer;
begin
for i:=0 to p-1 do
a[i]:=empty;
end;
雜湊函式值的運算根據函式的不同而變化,例如除餘法的乙個例子:
function h(x:longint):integer;
begin
h:= x mod p;
end;
我們注意到,插入和查詢首先都需要對這個元素定位,即如果這個元素若存在,它應該儲存在什麼位置,因此加入乙個定位的函式 locate
function locate(x:longint):integer;
var orig,i:integer;
begin
orig:=h(x);
i:=0;
while (ix)and(a[(orig+i)mod s]<>empty) do
inc(i);
//當這個迴圈停下來時,要麼找到乙個空的儲存單元,要麼找到這個元
//素儲存的單元,要麼表已經滿了
locate:=(orig+i) mod s;
end;
插入元素
procedure insert(x:longint);
var posi:integer;
begin
posi:=locate(x); //定位函式的返回值
if a[posi]=empty then a[posi]:=x
else error; //error 即為發生了錯誤,當然這是可以避免的
end;
查詢元素是否已經在表中
procedure member(x:longint):boolean;
var posi:integer;
begin
posi:=locate(x);
if a[posi]=x then member:=true
else member:=false;
end;
這些就是建立在雜湊表上的常用基本運算。
什麼是雜湊表
為什麼要用雜湊表?陣列的特點是 定址容易,插入和刪除困難 鍊錶的特點是 定址困難,插入和刪除容易 那麼能不能綜合兩者的特性,做出一種定址容易,插入和刪除也容易的資料結構?答案是肯定的,這就是我們要了解的雜湊表,也叫雜湊表 什麼是雜湊表?雜湊表也叫hash表 是根據關鍵碼值而進行直接進行訪問的資料結構...
為什麼是雜湊表?!
為什麼是雜湊表?1 提出問題 這裡有乙個大的跨國公司,公司中的職員資訊全部儲存在資料庫中。對於其中的任何乙個職員來說,他們的唯一標識就是員工號,而這個公司的員工號是按照職員工作的地點以及部門及工作開始時間確定的,比如01 20 09 24 3,這乙個職工編號 純屬杜撰,但也有實際作用,因為在像群體查...
動畫 什麼是雜湊表?
雜湊表雜湊表 hash table,也叫雜湊表 是根據鍵 key 而直接訪問在記憶體儲存位置的資料結構。也就是說,它通過計算乙個關於鍵值的函式,將所需查詢的資料對映到表中乙個位置來訪問記錄,這加快了查詢速度。這個對映函式稱做雜湊函式,存放記錄的陣列稱做雜湊表。雜湊函式 雜湊函式,顧名思義,它是乙個函...