日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

哈希表概念

發布時間:2025/5/22 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 哈希表概念 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

問題:

在內存中用數組存儲50000個單詞,用數組下標去找單詞很快,但我們在單詞軟件中不知道單詞在數組中的下標.

如a的下標為0,z最后單詞的下標為49999,如果以這種方式來找的話,那么查找z開頭的單詞速度就會相當的慢。

方案:

想一個方法快速的找到單詞相對應的下標,哈希函數的定義

將數據元素的關鍵字K作為自變量,通過一定的函數關系(稱為哈希函數),計算出的值,即為該元素的存儲地址

即其本身還是一個數組,只不過通過一個算法快速的找到其下標地址而已.

哈希函數的沖突

當用哈希函數新增元素時,算出來該元素的存儲地址若已經存有元素的話,那么就稱之為沖突,那么就得想辦法來避免這種沖突.

示例

下面來看一個實際的例子.只做演示

以一個元素為20個的數組為例子

1.哈希函數

取數組大小的余數,即5%20和25%20是相同的.

2.插入25,余數為5

所以其存儲地址為5

3.插入5

由于插入5時,與25的存儲地址發生了沖突,就需要處理,這里使用了開發地址法的線性探測方法

線性探測

即若遇到地址發生了沖突,則沿著數組的下標繼續尋找空白單元

查找

如查找25,算出來的存儲地址為5,馬上就能找到,即實現了1次查找,刪除操作與查找相同,找到以后賦空值就可

實現

public class IntHashTable {private int[] items;public IntHashTable(int size){items = new int[size];for (int i = 0; i < items.Length; i++){items[i] = -1;}}private int hashFunc(int key){return key % items.Length;}public void Insert(int item){int hashVal = hashFunc(item);while (items[hashVal]!=-1){hashVal++;}items[hashVal] = item;}public int Find(int key){int hashVal = hashFunc(key);while (items[hashVal]!=-1){if (items[hashVal] == key)return hashVal;hashVal++;hashVal = hashFunc(hashVal);}return -1;}public void Delete(int key){int hashVal = hashFunc(key);while (items[hashVal] != -1){if (items[hashVal] == key){items[hashVal] = -1;}hashVal++;hashVal = hashFunc(hashVal);}}public static void Main(){IntHashTable ht = new IntHashTable(20);ht.Insert(11);ht.Insert(12);ht.Insert(32);ht.Find(32);ht.Delete(32);} }

鏈地址法

將發生沖突的存在一個鏈表里面,并且保持鏈表有序.如下

public class Link {public int Value { get; set; }public Link Next { get; set; } }class SortedList {private Link first;public SortedList(){ first = null;}public void Insert(Link theLink){int key = theLink.Value;Link previous = null;Link current = first;while (current != null && key > current.Value){previous = current;current = current.Next;}if (previous == null)first = theLink;elseprevious.Next = theLink;theLink.Next = current;}public void Delete(int key){Link previous = null;Link current = first;while (current != null && key != current.Value){previous = current;current = current.Next;}if (previous == null)first = first.Next;elseprevious.Next = current.Next;}public Link Find(int key){Link current = first;while (current != null && current.Value <= key){if (current.Value == key)return current;current = current.Next;}return null;} }public class LinkHashTable {private SortedList[] items;public LinkHashTable(int size){items = new SortedList[size];for (int i = 0; i < items.Length; i++){items[i] = new SortedList();}}private int hashFunc(int key){return key % items.Length;}public void Insert(int item){int hashVal = hashFunc(item);var link = items[hashVal];link.Insert(new Link() { Value = item });}public int Find(int key){int hashVal = hashFunc(key);var link = items[hashVal];return link.Find(key).Value;return -1;}public void Delete(int key){int hashVal = hashFunc(key);var link = items[hashVal];link.Delete(key);} }

二次探測

當發生沖突時才進行探測,猶如人左右張望,先看右邊有無空位,再看左邊有無空位,即先確認左右,

如上圖的最后一個關鍵字3,

3和47沖突,先找到4(97)又發生沖突則找左邊2空位.

遵照哈希函數公式即可

轉載于:https://www.cnblogs.com/Clingingboy/archive/2011/01/20/1940700.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的哈希表概念的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。