1. 程式人生 > >通俗理解“雜湊表”

通俗理解“雜湊表”

轉自:http://baijiahao.baidu.com/s?id=1580022096840800840&wfr=spider&for=pc

今天聊聊「雜湊表」,「雜湊表」主要作用在於高效查詢。

在程式設計實現中,常常面臨著兩個問題:儲存和查詢,儲存和查詢的效率往往決定了整個程式的效率。

腦補下,你在家裡忘記了指甲刀放在哪裡,通常要在你家所有抽屜中順序尋找,直到找到,最差情況下,有N個抽屜,你就要開啟N個抽屜。這種儲存方式叫陣列,查詢方法稱為「遍歷」。

腦補下,你是一個整理控,所有物品必須分門別類放入整理箱,再將整理箱編號,比如1號放入針線,2號放入證件,3號放入細軟。這種儲存和查詢方式稱為「雜湊」,如果這個時候要查詢護照,你不許要再翻所有抽屜,直接可在2號整理箱中獲取,通常只用一次查詢即可,如何編號整理箱,稱為雜湊演算法。

同樣是查詢,差距怎麼那麼大涅~,假設我們有100億條資料記錄,那差距就變得明顯,遍歷需要查詢最多100億次,最少1次,雜湊只需1次。

讓我們正式介紹雜湊和雜湊演算法,雜湊也稱雜湊,雜湊表是一種與陣列、連結串列等不同的資料結構,與他們需要不斷的遍歷比較來查詢的辦法,雜湊表設計了一個對映關係f(key)= address,根據key來計算儲存地址address,這樣可以1次查詢,f既是儲存資料過程中用來指引資料儲存到什麼位置的函式,也是將來查詢這個位置的演算法,叫做雜湊演算法。

讓我們舉個例子,比如下面這幾個人物,按陣列儲存:

這樣我要找到大胸姐的電話號碼,需要順序查詢對比整個陣列,第一個餘罪,不是,第二個不是,第三個不是,直到第四個找到大胸姐。

如果以hash儲存呢?首先讓我們來看看如何設計雜湊演算法,雜湊演算法可以隨意設計,教科書上一般會說以下幾種方法:直接定址發,平方取中法,除數取餘法,雜湊演算法的本質上是計算一個數字,如果用這幾種方法講解會稍顯晦澀,我們假設我們的雜湊演算法是取姓名的首字母。所以f(餘罪) = y, f(傅老大) = f,f(沈嘉文) = s,f(大胸姐) = d。

構建的hash表如下:

我們看到他們分別以姓名首字母的位置插入到這一張表格中,這樣我們構建了這樣一個Key-Value表格,此表就是雜湊表,也稱為Hash Table。未來,當我們要查詢餘罪的時候,通過計算,餘罪在y位置,可以通過1次查詢,找到這條記錄,也即手機號。

這個時候有客官問了,那以首字母為雜湊函式的話,應該有很多比如以y的姓名啊,這個時候就不是一次查找了吧,其實有很多條記錄都對映到一個位置上,稱為雜湊衝突。

雜湊衝突是跟雜湊函式的設計正相關的,你的隨機性越大,那麼產生雜湊衝突的可能性越小,在小概率下,如果還有衝突怎麼辦,這個時候要做些有損的設計,比如如果有兩個首字母為y的姓名,那麼可以接到餘罪的後面,當查詢的時候,需要先查詢到y,然後再順序查詢,如圖所示:

還有一些解決雜湊衝突的辦法叫「雜湊再雜湊」,也就是針對第一次雜湊的結果再進行一次hash來減小衝突的概率。

這就是Hash表,首先Ta是一種資料結構,是一種效率極高的查詢方式,雜湊表的核心在於雜湊函式的設計,雜湊衝突了不要緊,我們要增加隨機性以及對衝突進行適當的有損化的處理。

題圖來自PEXELS,基於CC0協議


本文轉自:http://baijiahao.baidu.com/s?id=1580022096840800840&wfr=spider&for=pc

如有侵權,聯絡本人qq276257191,馬上刪除

相關推薦

通俗理解

轉自:http://baijiahao.baidu.com/s?id=1580022096840800840&wfr=spider&for=pc今天聊聊「雜湊表」,「雜湊表」主要作用在於高效查詢。在程式設計實現中,常常面臨著兩個問題:儲存和查詢,儲存和查詢的效

理解及其查詢

 以上討論的查詢方法,由於資料元素的儲存位置與關鍵碼之間不存在確定的關係,因此,查詢時,需要進行一系列對關鍵碼的查詢比較,即“查詢演算法”是建立在比較的基礎上的,查詢效率由比較一次縮小的查詢範圍決定。理想的情況是依據關鍵碼直接得到其對應的資料元素位置,即要求關鍵碼與資料

讀完這篇,你一定能真正理解什麼是

本文全是乾貨,讀完希望對你有所幫助~  雜湊表也稱為散列表,是根據關鍵字值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵字值對映到一個位置來訪問記錄,以加快查詢的速度。這個對映函式稱為雜湊函式(也稱為雜湊函式),對映過程稱為雜湊化,存放記錄的陣列叫做散列表。比如

深入理解hashmap(三)和二叉搜尋樹的恩怨情仇

前面兩篇文章介紹了hashmap的原始碼和理論,今天把剩餘的部分紅黑樹講一下。理解好紅黑樹,對我們後續對hashmap或者其他資料結構的理解都是很有好處的。比方說為什麼後面jdk要把hashmap中的單鏈表更新成紅黑樹? 要理解紅黑樹首先要弄清楚普通二叉樹的一些基本概念 父節點和子節點,這個我就不多說了。

進一步理解javascript物件、陣列和

在javascript中,物件實際上就是一個雜湊表,比如下面這個user物件: function user(n, a) { this.name = n; this.age = a; this.toString = function() {

Hash(/)中衝突處理及命中計算

前言   本片部落格主要講的是雜湊表中簡單的衝突處理的方法,以及命中率計算。原理方面基本沒有講解,基本就講個方法,主要用於知識記錄以及幫助一些刷題玩家瀏覽。   簡而言之,不講技術,只講方法。 引言   寫這篇部落格的契機是在刷pat甲級題遇到了一道寫雜湊的題目,結果英文太次被欺負了。之後靠翻譯讀懂題

查詢演算法 淺談演算法和資料結構: 七 二叉查詢樹 淺談演算法和資料結構: 十一

閱讀目錄 1. 順序查詢 2. 二分查詢 3. 插值查詢 4. 斐波那契查詢 5. 樹表查詢 6. 分塊查詢 7. 雜湊查詢   查詢是在大量的資訊中尋找一個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。本文

【LeetCode】 hashmap(共88題)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } 【1】Two Sum  【3】Longest Substring Without Repeating Characters  【18】4Sum 

記錄一下底層原理

理解HashMap底層,首先應該理解Hash函式 從解決一個問題入手:大量的資料要儲存查詢,構造雜湊表來解決 初步想法 借鑑陣列下標訪問的思路來做,只需知道起始位置和下標值, 不管陣列中有多少個元素,都可以一次訪問到, 將元素和元素位置建立一種一一對應的關係 Hash函式的出現 輸入的元素的範圍

散列表()+衝突的解決方法

轉載http://www.nowamagic.net/academy/detail/3008060 1散列表 1簡單來說就是給一個key,就可以找到對應的key的儲存位置,就像身份證對應一個人一樣 儲存位置 = f(key) 2hashMap的key就是用到散列表 1.1雜湊衝突

九章演算法筆記 8.與堆 Hash & Heap

大綱 cs3k.com 資料結構概述 雜湊表 Hash: a.原理  b.應用 堆 Heap: a.原理    b.應用-優先佇列 Priority Queue  c.替代品-TreeMap   資料結構的兩類問題 cs3k

27-集合--Set及其子類(HashSet+LinkedHashSet+TreeSet)+二叉樹+Comparable+Comparator++HashSet儲存自定義物件+判斷元素唯一的方式

一、Set 1、Set:元素不可以重複,是無序的(存入和取出的順序不一致) 2、Set介面中的方法和Collection中的方法一致 3、Set集合的元素取出方式只有一種:迭代器iterator() Set set = new HashSet(); I

基於實現字典和集合

上一節說到了雜湊表。 我們提到了字典和集合是由雜湊表實現的,具體的實現過程是怎麼樣的呢? 其實很簡單,字典裡面有取值,新增值,正好對應的就是雜湊表中的find和add方法。使用__getitem__和__setitem__代替兩者就可以了。然後對於keys,values取值,只需要遍歷迴圈就行了。 這裡

的原理及實現

雜湊表(Hash table,也叫散列表), 是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。 雜湊表hash table(key,value) 的做法

資料結構基礎之查詢(下):

轉自:http://www.cnblogs.com/edisonchou/p/4706253.html   查詢(下):雜湊表 雜湊(雜湊)技術既是一種儲存方法,也是一種查詢方法。然而它與線性表、樹、圖等結構不同的是,前面幾種結構,資料元素之間都存在某種邏輯關係,可以用連線圖示

構建——優化暴力求解方程

/*  Consider equations having the following form: a*(x1)^2+b*(x2)^2+c*(x3)^2+d*(x4)^2=0 a, b, c, d are integers from the interval [-50,50] and

構造——求前m大的數

Problem Description 給你n個整數,請按從大到小的順序輸出其中前m大的數。 Input 每組測試資料有兩行,第一行有兩個數n,m(0<n,m< 1000000),第二行包含n個各不相同, 且都處於區間[-500000,500

—拉鍊法

public class Link { /** * 有序連結串列連結點 */ public int data; public Link nextLink; public Link(int data){ this.data = data; } publi

二叉樹和的優缺點對比與選擇

二叉樹(binary tree)和雜湊表(hash table)都是很基本的資料結構,但是我們要怎麼從兩者之間進行選擇呢?他們的不同是什麼?優缺點分別是什麼? 回答這個問題不是一兩句話可以說清楚的,原因是在不同的情況下,選擇的依據肯定也不同。首先來回顧一下這兩個資料結構: 雜湊表使用hash functi

-- C語言實現

1 雜湊表原理 這裡不講高深理論,只說直觀感受。雜湊表的目的就是為了根據資料的部分內容(關鍵字),直接計算出存放完整資料的記憶體地址。 試想一下,如果從連結串列中根據關鍵字查詢一個元素,那麼就需要遍歷才能得到這個元素的記憶體地址,如果連結串列長度很大,查詢就需要更多的時間. void*