一.雜湊演算法的定義
1.雜湊演算法又叫雜湊演算法,是將任意長度的二進位制值對映為較短的固定長度的二進位制值,這個小的二進位制值稱為雜湊值。它的原理其實很簡單,就是把一段交易資訊轉換成乙個固定長度的字串。
2.雜湊表是基於快速訪問的角度設計的,是一種典型的空間換時間的做法,
二.從set/map談到hash_set/hash_map
1.set/map都是基於rb-tree之上,所以有自動排序的功能;hash_set/hash_map都是基於hashtable之上,所以不含有自動排序的功能
三.針對遇到的海量資料問題進行分析,一般有下列三類問題
1.資料量大,記憶體小的情況(分而治之+hash對映)
2.判斷資料是否在集合中(布隆過濾器+bitmap)
3.各種topn(儲存和各種排序)
四.經典面試題
1.尋找前k個熱門查詢
[1]如果所有資料量的位元組數小於記憶體限制,可以考慮將資料都放入記憶體
[2]hash統計,使用hash_map構建乙個以查詢字串為鍵,出現的次數為值的hashtable
[3]採用堆排序找出前k個熱門查詢
2.怎麼在海量資料中找出重複次數最多的乙個?
1)先做hash對映,求模將大檔案中的內容對映到小檔案中
2)然後hash統計,求出每個小檔案中重複次數最多的乙個,並記錄重複次數。
3)最後快速排序/堆排序/歸併排序,找出上一步求出的資料中重複次數最多的乙個就是所求
3.有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。
解決方案:(1g=5000*200k,將檔案分成5000個小檔案,每個檔案200k)
1)分而治之/hash對映:順序讀檔案中,對於每個詞x,取hash(x)%5000,然後按照該值存到5000個小檔案(記為x0,x1,…x4999)中。這樣每個檔案大概是200k左右,並且每個檔案存放的都是具有一樣hash值的詞。如果其中的有的檔案超過了1m大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1m。
2)hash統計:對每個小檔案,採用hash_map等統計每個檔案**現的詞以及相應的頻率。
3)堆/歸併排序:取出出現頻率最大的100個詞(可以用含100個結點的最小堆),並把100個詞及相應的頻率存入檔案,這樣又得到了5000個檔案。最後就是把這5000個檔案進行歸併(類似於歸併排序)的過程了。
給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a、b檔案共同的url?
可以估計每個檔案安的大小為5g×64=320g,遠遠大於記憶體限制的4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。
1)分而治之/hash對映:遍歷檔案a,對每個url求取hash(url)%1000,然後根據所取得的值將url分別儲存到1000個小檔案中。這樣每個小檔案的大約為300m。遍歷檔案b,採取和a相同的方式將url分別儲存到1000小檔案中。這樣處理後,所有可能相同的url都在對應的小檔案中然後我們只要求出1000對小檔案中相同的url即可。
2)hash統計:求每對小檔案中相同的url時,可以把其中乙個小檔案的url儲存到hash_set中。然後遍歷另乙個小檔案的每個url,看其是否在剛才構建的hash_set中,如果是,那麼就是共同的url,存到檔案裡面就可以了
6在2.5億個整數中找出不重複的整數,注,記憶體不足以容納這2.5億個整數。
採用2-bitmap(每個數分配2bit,00表示不存在,01表示出現一次,10表示多次,11無意義)進行,共需記憶體2^32 * 2 bit=1 gb記憶體,還可以接受。然後掃瞄這2.5億個整數,檢視bitmap中相對應位,如果是00變01,01變10,10保持不變。所描完事後,檢視bitmap,把對應位是01的整數輸出即可。
b樹和hash的應用場景
關係型資料庫中,索引大多採用b b 樹來作為儲存結構,而全文搜尋引擎的索引則主要採用hash的儲存結構,這兩種資料結構有什麼區別?hash結構的特點 檢索效率非常高,索引的檢索可以一次到位,o 1 b樹需要從根節點到枝節點,最後才能到葉節點進行多次i o操作,所以hash的效率遠遠高於b樹的效率。那...
雜湊演算法及其應用場景
雜湊演算法的概念和特性 我們前面分享了雜湊表 雜湊函式和雜湊衝突,其實也可以譯作雜湊表 雜湊函式和雜湊衝突,是乙個意思。雜湊演算法簡單理解就是實現前面提到的雜湊函式的演算法,用於將任意長度的二進位制值串對映為固定長度的二進位制值串,對映之後得到的二進位制值就是雜湊值 雜湊值 我們日常開發中最常見的雜...
Redis應用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...