問答丨如何理解雜湊表的工作原理?
#我頭新條聞#
雜湊來自英文hash的翻譯。其實恰如其分應該叫雜湊。雜湊的目的就是找到一個函式能夠將一堆數字均勻分佈在一維陣列裡。理想狀態大家儲存的位置是不同的,否則雜湊函式比較糟糕。但是當兩個數字經過一次雜湊發現存在同一個陣列裡,還會二次雜湊把他存在另外一個不同地方,這就是所謂雙雜湊。但是影響雜湊儲存的最關鍵因素是陣列大小,當足夠大大家發生碰撞機會比較少,這就是為什麼記憶體資料庫,key值達到記憶體70%就要擴容。剛才看到樓上說的太簡單而且概念有些錯誤忍不住發表兩句。我們很少會用到陣列加連結串列方式,因為查詢不穩定。基本通過空間換時間才能達到大o常數效率
#ICMLL實驗室 #
科研工作者、科學達人
雜湊表是根據關鍵值(key)來直接訪問目標值(value)的一種資料結構。其特點就在於能夠快捷的實現資訊的查詢和檢索。
比如我們在手機中存放的通訊錄就是用雜湊表來實現的,即我們輸入一個聯絡人的姓名,就能返回相應的電話號碼。用雜湊表實現的過程就是,將聯絡人姓名的字元通過一個雜湊函式,對映成一個整數(雜湊碼),然後根據雜湊碼來索引出電話號碼。比如雜湊碼為5,就表示是在儲存位置為5,因此我們就能直接取出該位置的值,並返回結果。
那麼實現雜湊表的關鍵就在於雜湊函式的構建,也就是如何建立一個合適的索引來滿足如下條件:
1)同一個鍵每次輸入到雜湊函式中,其對應的雜湊碼也必須相同;
2)不同鍵對應的雜湊碼不能相同。
第一個條件意味著雜湊函式必須是確定性的;第二個條件則要求不能出現雜湊衝突。當兩個或更多個鍵產生相同的雜湊碼時就會發生衝突(hash collisions)。
比如我們現在考慮建立一個簡單的雜湊表來查詢年齡,{Jim:5, Davis:7, Taylor:12, Bob:3},如果我們選擇雜湊函式為輸入鍵值的字元個數。那麼在建立雜湊表時,就講Jim存放在位置3處,Jack存放在位置4處。而這樣的話Jim和Bob的儲存位置就會發生衝突,不符合雜湊函式的要求。但是如果我們將雜湊函式替換為首字母順序存放,在這個資料中就沒有雜湊衝突了。
然而萬一無法避免雜湊衝突的話,我們可以用連結和線性探測的方法來避免雜湊值發生碰撞。
連結就是將發生衝突的鍵值直接連結在連結串列的尾部;線性探測則是,如果在位置i處發生衝突,那麼就檢查i+1處是否為空,為空的話就將衝突鍵值放入其中,否則繼續檢查下一個。
#楊沐白 #
網際網路演算法工程師
謝邀。這個問題很有趣,雜湊(Hashing)是一種用於從一組相似物件中唯一標識特定物件的技術。
一個簡單的例子
我們生活中如何使用雜湊的一些例子包括:
在大學中,每個學生都會被分配一個唯一的卷號,可用於檢索有關它們的資訊。
在圖書館中,每本書都被分配了一個唯一的編號,可用於確定有關圖書的資訊,例如圖書館中的確切位置或已發給圖書的使用者等。
在這兩個例子中,學生和書籍都被分成了一個唯一的數字。
假設您有一個物件,並且您想為其分配一個鍵以便於搜尋。 要儲存鍵/值對,您可以使用一個簡單的陣列,如資料結構,其中鍵(整數)可以直接用作儲存值的索引。 但是,如果金鑰很大並且無法直接用作索引,則應使用雜湊(Hashing)。
在雜湊中,通過使用雜湊函式將大鍵轉換為小鍵。 然後將這些值儲存在稱為雜湊表的資料結構中。 雜湊的想法是在陣列中統一分配條目(鍵/值對)。 為每個元素分配一個鍵(轉換鍵)。 通過使用該鍵,您可以在O(1)時間內訪問該元素。 使用金鑰,演算法會計算一個索引,該索引可以找到或插入條目的位置。
雜湊一般分兩步執行:
通過使用雜湊函式將元素轉換為整數。 此元素可用作儲存原始元素的索引,該元素屬於雜湊表。
元素儲存在雜湊表中,可以使用雜湊鍵快速檢索它。
hash = hashfunc(key)
index = hash%array_size
在此方法中,雜湊與陣列大小無關,然後通過使用模運算子(%)將其縮減為索引(介於0和array_size - 1之間的數字)。
應用場景
關聯陣列:雜湊表通常用於實現許多型別的記憶體表。 它們用於實現關聯陣列(索引是任意字串或其他複雜物件的陣列)。
資料庫索引:雜湊表也可以用作基於磁碟的資料結構和資料庫索引(例如在dbm中)。
快取記憶體:雜湊表可用於實現快取記憶體,即用於加速對資料的訪問的輔助資料表,其主要儲存在較慢的介質中。
物件表示:一些動態語言(如Perl,Python,JavaScript和Ruby)使用雜湊表來實現物件。
提升速度:雜湊函式用於各種演算法,以使其計算更快。
∑編輯 | Gemini
來源| 今日頭條
更多精彩:
☞ 曲面論
演算法數學之美微信公眾號歡迎賜稿
稿件涉及數學、物理、演算法、計算機、程式設計等相關領域,經採用我們將奉上稿酬。
投稿郵箱:math_alg@163.com
相關文章
- 雜湊表(雜湊表)原理詳解
- 雜湊表的原理
- 深入理解雜湊表(JAVA和Redis雜湊表實現)JavaRedis
- 雜湊表(雜湊表)詳解
- 雜湊競猜開發原理丨雜湊競猜遊戲原始碼丨雜湊競猜系統開發設計程式碼遊戲原始碼
- PHP雜湊表碰撞攻擊原理PHP
- Python:說說字典和雜湊表,雜湊衝突的解決原理Python
- Java Servlet工作原理問答JavaServlet
- Java Servlet 工作原理問答JavaServlet
- 從雜湊表(HashTable)的角度深入理解《PHP 陣列的雜湊碰撞攻擊》PHP陣列
- PHP7 雜湊表實現原理PHP
- 雜湊表
- 雜湊競猜遊戲系統開發原理丨雜湊遊戲系統開發技術方案丨雜湊競猜遊戲開發原始碼搭建遊戲開發原始碼
- 【尋跡#3】 雜湊與雜湊表
- Hash雜湊遊戲原始碼丨雜湊競猜遊戲系統技術開發丨Hash雜湊遊戲講解遊戲原始碼
- 字串雜湊表字串
- 6.7雜湊表
- 查詢(3)--雜湊表(雜湊查詢)
- 雜湊競猜遊戲開發示例丨Hash雜湊遊戲系統開發丨雜湊競猜遊戲詳情遊戲開發
- 雜湊遊戲原始碼開發搭建丨hash雜湊遊戲競猜原始碼搭建丨雜湊遊戲系統開發遊戲原始碼
- 雜湊競猜遊戲的原理遊戲
- 幾道和雜湊(雜湊)表有關的面試題面試題
- HASH雜湊遊戲原始碼丨HASH雜湊遊戲系統開發丨HASH雜湊遊戲開發成品原始碼部署原始碼遊戲開發
- 雜湊遊戲系統丨雜湊遊戲系統開發(演示版)丨雜湊遊戲開發原始碼及案例遊戲開發原始碼
- 雜湊遊戲系統技術開發丨雜湊單雙競猜遊戲原始碼丨雜湊遊戲程式設計技術遊戲原始碼程式設計
- 雜湊表應用
- 實現雜湊表
- 淺談雜湊表
- hash雜湊遊戲競猜系統合約開發解析丨defi丨雜湊遊戲原始碼遊戲原始碼
- 雜湊表(Hash)的應用
- 符號表與雜湊表符號
- R語言——雜湊表R語言
- JAVA 實現 - 雜湊表Java
- 雜湊表的兩種實現
- js 雜湊雜湊值的模組JS
- 【閱讀筆記:雜湊表】Javascript任何物件都是一個雜湊表(hash表)!筆記JavaScript物件
- 雜湊技術【雜湊表】查詢演算法 PHP 版演算法PHP
- HASH雜湊值競猜遊戲開發原始碼丨原始碼示例丨HASH雜湊遊戲程式設計遊戲開發原始碼程式設計