演算法 查詢 雜湊表查詢

2021-07-13 11:15:24 字數 2000 閱讀 8285

查詢除了線性表的查詢(順序、二分、分塊),樹上查詢(bst、b-樹),還有一種雜湊查詢。

相比於前兩種查詢,雜湊表的查詢效率驚人的高o(1),它採用的直接定址技術,基本上就是實現了精準打擊,達到一擊而中的效果。

所謂的直接定址技術,說白了,就是儲存記錄時,通過雜湊函式計算出乙個雜湊位址;讀取記錄時,通過同樣的雜湊函式計算出位址,然後按照位址訪問記錄。整個過程有點類似於數學中的對映,乙個或者多個key通過對映對應到乙個位址,同樣也不會存在多個位址對應乙個key的情況。

這裡提到了乙個關鍵:雜湊函式

雜湊函式,其實就是一種對映關係。它的選取,一般會遵循兩個原則:從實現上說要求簡單,從效果上說要求均勻。認真想一下就不難明白,我們的雜湊查詢本來就要求高效,如果在這個計算位址的過程山一重水一重,那豈不是南轅北轍了?所以越簡單越好。那為什麼要求均勻呢?這就涉及到另外乙個問題,衝突。不妨先假想一下,如果採用的雜湊函式計算出來的位址個個都一樣,再不做特殊處理的話,取值訪問的時候,那不是目瞪口呆無從下手了。

那到底該如何選取所謂的雜湊函式呢,在前輩們的探索中,總結出來一些具有代表性的方法,這裡就直接貼出來了。

前面已經說過,不管採用哪種方法構造出來的雜湊函式,最終生成的雜湊位址都有可能重複,也就是所謂的衝突,只是概率的大小問題。

當衝突不可避免時,就不得不考慮解決方案了。這裡介紹常見的四種。

下面使用「除數留餘」和「開放位址」來模擬一下雜湊查詢。

要插入的資料是;

老規矩,能上**就不多說話。

public

class

hashsearch ;

for (int i = 0; i < array.length; i++)

for (int i = 0; i < array.length; i++)

}public

static

class

hash

}//初始化

public

static hash inittable(int size)

return hash;

}//計算雜湊值

public

static

intcomputehash(int key,hash hash)

return defaultvalue;

}//插入

public

static

void

insert(int key, hash hash)

hash.address[index] = key;

}//查詢

public

static

boolean

search(int key, hash hash)

}system.out.println("找到" + key + "了,它在表中的第" + index + "個位置");

return

true;

}}

程式的輸出:

找到12了,它在表中的第0個位置

true

找到67了,它在表中的第7個位置

true

找到56了,它在表中的第8個位置

true

找到16了,它在表中的第4個位置

true

找到25了,它在表中的第1個位置

true

找到37了,它在表中的第2個位置

true

找到22了,它在表中的第10個位置

true

找到29了,它在表中的第5個位置

true

找到15了,它在表中的第3個位置

true

找到47了,它在表中的第11個位置

true

找到48了,它在表中的第6個位置

true

找到34了,它在表中的第9個位置

true

查詢演算法 雜湊演算法,雜湊表查詢

那麼問題來了,如果集合s中同時存在值k 16和值k 27,我們該如何將兩個位址一樣的值存入雜湊表呢?常用的雜湊函式 處理衝突的方法 2.連位址法 雜湊表涉及的是一種對映關係,可以根據某個值查詢到關鍵字的位址,這樣的做法省去了比較的時間,優化了演算法。雜湊表是把值 關鍵字 存到跟它具有 唯一 對映的格...

《演算法》 查詢 雜湊表

雜湊表也是一種符號表,主要特徵是可以將鍵通過雜湊函式對映為乙個陣列索引,然後利用這個陣列索引就可以做很多東西。當我們輸入乙個物件,不論這是個什麼東西,經過雜湊函式處理之後輸出乙個0到m 1的範圍之內的整數。對於雜湊函式有一些要求 相等的物件 使用equals 函式 的雜湊值是相同的 2.同樣的雜湊值...

查詢 雜湊表查詢(雜湊表)

1 雜湊表查詢定義 雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查詢集合中存在這個記錄,則必定在f key 的位置上。採用雜湊技術將記錄儲存在一塊連續的儲存空間中...