哈希如何處理海量數據問題

搜索(查找)使用的數據結構
平衡二叉樹
內存中使用的——二叉平衡樹

  1. AVL樹
  2. 紅黑樹

哈希表:

  1. 目的(查詢)
  2. 基本原理:1.哈希 2.衝突 3.數據(隨機訪問O(1) )

對比 哈希 vs 加密 vs 壓縮

  • 哈希:任意數據=>比之前小的數據 . hash(data)=哈希值<<data
    單向:原始數據=>哈希值 哈希值不能返回到原始數據。
    MD5,SHA-256(用來校驗正確性1.保存密碼2.TCP的校驗和 )
  • 加密:不保證加密過的數據<原始數據 加密獨有的特徵:有密鑰(你自己獨有的一串數據)
    雙向:原始數據=>密文 密文=>原始數據 算法是公開的,祕鑰是私有的 (可保證安全性)
    對稱加密:在加密和解密的過程中使用的同一把祕鑰(使用敏感信息)DES,3DES,AES
    非對稱加密:先生成一對祕鑰privateKey,publicKey,A要給B發送信息,首先會給B publicKey,然後A對發送信息使用privateKey加密,發送給B,B使用publicKey解密,公鑰和私鑰是需要配合使用的。
    RSA,ECC,DSA
  • 壓縮:滿足一定特徵的數據=>比之前數據小的數據 compress(data)=壓縮後的數據<<data
    雙向:原始數據=>壓縮數據 壓縮數據=>原始數據 (算法公開,任意拿到數據的人可以壓縮,解壓)
    zip/rar/gzip 普通
    jpg/png 圖片
    哈夫曼樹
    h264 視頻
    (有損壓縮,無損壓縮)

海量數據處理(哈希有關)

  1. 一組無符號整數中,如何判斷一個數在還是不在?
    回答是:利用Set< Long >set=…;
    第一步:把所有的數據都放在set 中;
    第二步:判斷在與不在 set.contains(n);
  2. 40億個無符號的整數中,如何判斷一個數是在還是不在?
    回答是,無法使用第一問的方式解決,因爲40億*32位=內存佔用量太大了,內存裏面放不下
  3. 位圖的出現:
    1 .類似使用hash表,但是不能有哈希衝突。——無符號整數滿足這個條件 0=>0 ,1=>1 是一一對應的
    2 .利用1bit來保存一份信息,所以只能保存二元信息: 1/0 ,true/false, yes/no, 存在/不存在
    在這裏插入圖片描述
    如果查找3在不在? 如果3號小標對應的bit爲1則代表在,如果是0代表是不在。

布隆過濾器——彌補位圖的一部分缺點:
位圖的缺點是:只能保存無符號的字符,因爲要求不能出現hash衝突
海量數據時:背後使用了位圖,解決的是通用數據的 在還是不在的問題?
布隆過濾器的提出:
我們在使用新聞客戶端看新聞時,他會給我們不停推送新的內容,它每次推薦是需要去重,去掉呢些一進看過的內容問題來了,問題來了,新聞科客戶端如何實現推送的去重呢?用服務器記錄用戶看多的歷史記錄,當及推薦系統推薦新聞的時候會從每個用戶的歷史記錄裏進行篩選,過濾掉呢些已經存在的記錄,如何快速查找呢些已經看多的視頻呢?

1.用哈希表存儲用戶的記錄,缺點是太浪費空間。
2.用位圖存儲用戶的記錄,無法解決哈希衝突。
3.將哈希表和位圖相結合。
在這裏插入圖片描述
布隆過濾器(輕量級)配合 完整行爲分析(記錄你每一個行爲,重量級)
在這裏插入圖片描述

海量數據處理的面試題:(特徵是數據量大到按通常的方案,一臺機器的內存中是放不下的)

  1. 哈希切割:
    給一個超過100G(此100G其實就是代表內存放不下的)大小的log file,log中存着ip地址,設計算法找到出現次數最多的IP地址?
    與上題條件一樣,如何找到top K的IP?
    如果沒有海量數據的限制下,這個問題如何求解?
    一組數據中,找到某個數據的出現次數。
    思路:掃描所有的數據,得到Map<數據,出現次數>,
    然後得到反向Map<出現次數,數據>,排序出現次數,再根據次數找到數據。

那如果加上海量數據此問題如何解決?
海量數據會導致內存中無法一次讀取處理 ---->我們可以分爲多次處理----->分文件處理
那分文件可以平均分割嗎? 提前保證分出的大小是夠一次內存處理
在這裏插入圖片描述
呢我們該如何解決這個問題呢?
對數據進行排序?
如果使用排序的話,成本會非常的大——歸併排序O(n*log(n) ),保證相同ip出現在同一個相同文件(需要一定的成本)
我們可以通過哈希函數(ip)=>下標(被分到的文件的下標)
在這裏插入圖片描述
海量數據處理的萬能套路:

分文件處理,需要按照哈希方式分文件
先分組,然後就可以避免之前的呢樣情況,這樣會將選擇一樣的分到一個陣營中,就不如看足球比賽,喜歡不同隊你就加入不同隊所在的區域,穿着同樣的衣服,就算如果裁判的話可以一眼看過去看到哪一隊的粉絲最多。

第二個問題如何找到出現最多次top K的IP?
不考慮海量數據的限制:使用小堆解決。(華山論劍,先看K是多少就佔多少坑,然後不斷的使用數據和對的root節點比大小,數據比完也就是找到了topK)

現在加上海量數據:
我們找出現次數最多的3個ip

計算每一個分組的文件的TOP3問題:
在這裏插入圖片描述

  1. 遍歷文件中的每一個ip,統計每個ip的出現次數Map< ip,出現次數 >
  2. 逆置Map=>Map<出現次數,ip>
    在這裏插入圖片描述
  3. 建一個小堆(大小爲3),找出TOP3
  4. 最後從選出的代表中找出全局的TOP3

位圖的應用

1.給定100億個整數,設計算法找到只出現一次的整數?
海量數據的第二個思路:做數據的信息壓縮(位圖+布隆過濾器)
就是把數據小化,不是萬能套路,有限情況下如果可以使用,速度一般會比分文件快。

2.給兩個文件,分別有100億個整數,我們只有1G內存,如何找到兩個文件交集?
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章