1. 程式人生 > >點陣圖&布隆過濾器&雜湊表的應用——海量資料處理

點陣圖&布隆過濾器&雜湊表的應用——海量資料處理

1. 給定一個大小超過 100G 的檔案, 其中存著 IP 地址, 找到其中出現次數最多的 IP 地址

100G遠遠大於記憶體的大小,因此不能一次全部讀入到記憶體中進行統計。

進行雜湊切分,一般的記憶體是4G,但肯定不能一下子把4G填滿,記憶體還要放其他的東西,因此可以選擇切成1000份小檔案,每份大小100G/1000=100M(這個值只是估算一下,實際上每份的大小是和具體的資料有關係)

將ip地址對映到相應檔案中 index = hash_func(ip)
相同的ip地址一定得到的是相同的索引值,進入了同一個小檔案
在每個小檔案中分別找出出現次數最多的ip地址
將所有小檔案中的結果彙總,找出所有檔案中出現次數最多的Ip地址

2. 給定100億個整數, 找到其中只出現一次的整數

方法一:
使用點陣圖
2^32位元組=4G
2^32 ≈ 42億9千萬
100億個int –> 所佔大小100億*4位元組 = 400億位元組 ≈ 40G
所以常規操作是不可行了,像這樣找“只出現一次”的問題,可以考慮用點陣圖
普通的點陣圖用1位表示一個數存在或不存在,統計次數的話用兩位的點陣圖
整數約有 42億9千萬(即2^32=4G)個,(42億9千萬 * 2 )/ 8 = 1G
00:沒出現過
01:出現過一次
02:出現過多次

將100億個整數存入點陣圖中,遍歷點陣圖,找出狀態為01的數

方法二:
雜湊切分
將100億個整數切分為400份,每份400M,分別找到每個小檔案中只出現一次的整數,再合併,篩選出合併後只出現一次的整數

3. 有兩個檔案, 分別有100億個query(查詢詞, 字串), 只有1G記憶體, 找到兩個檔案的交集

近似演算法:
查詢字串是否存在使用布隆過濾器
1.定義一個1G的點陣圖,能存放大約10億*8=80億個位
2.字串通過雜湊函式得到整數,將點陣圖中整數對應的位置1
3.再讓另一個檔案的query使用相同的雜湊函式得到的位來這個點陣圖中找

精確演算法:
雜湊切分,切1000份,每份約400M
將兩個檔案的query分別進行雜湊切分,使用相同的雜湊函式將query轉換為一個整數,再用整數模上1000得到一個下標值,將query存入對應下標的小檔案中

相同的query一定進入了相同下標的小檔案
對比兩份下標相同的小檔案,找出其交集,將1000份小檔案的交集彙總起來即兩份檔案的交集

4. 給上千個檔案, 每個檔案大小為1K - 100M, 設計演算法找到某個詞存在在哪些檔案中

倒排索引
遍歷所有檔案,將出現的單詞進行雜湊計算,建立雜湊桶
單詞出現在哪個檔案中,就把該檔案存入單詞對應的雜湊桶中

查詢時,只需將要找的單詞用同樣的雜湊函式進行對映,找到對應的桶,就能找到它在哪些檔案中出現過

相關推薦

點陣&過濾器&應用——海量資料處理

1. 給定一個大小超過 100G 的檔案, 其中存著 IP 地址, 找到其中出現次數最多的 IP 地址 100G遠遠大於記憶體的大小,因此不能一次全部讀入到記憶體中進行統計。 進行雜湊切分,一般的記憶體是4G,但肯定不能一下子把4G填滿,記憶體還要放其他的東

點陣切分的大資料處理

點陣圖是一個數組的每個資料的每個二進位制位表示一個數據,0表示資料不存在,1表示資料存在; 在現實生活中,大資料的處理十分的常見;比如說,給40億個不重複的無符號整數,沒排過序,如何快速判斷一個數是否在這40億個數中? 要解決這個問題,我們首先想到的是先排序,在進行二分查詢

python中 應用,常見函式 MD5和SHA2演算法

通過雜湊函式計算資料儲存 insert(key, value) 插入鍵值對 get(key) 獲取值 delete(key) 刪除值 常見雜湊函式 除法雜湊:h(k) = k % m 乘法雜湊:h(k) = floor(m*(

應用

雜湊表-查詢O(1)複雜度的利器。 理論上說,當輸入規模夠大時是不可能沒有衝突的,因為兩個域要有對映,且結果域是遠遠小於輸入域的,選取一個好的雜湊函式固然重要,但是解決衝突的方法也是必不可少。 這裡先普及一些東西:雜湊函式,在隨機大樣本測試下,基於概率學的研究,每個桶內部的元素個數是差不多的

刁肥宅資料結構課設“過濾器的實踐與應用”原始碼(v1.0,永不上交)

       程式碼很簡單,寫了一些註釋;加上註釋看就很清楚了。        檔案bloomfilter.cpp: #include "bloomfilter.h" // return a hash range from 0 to 79999 int hash(con

過濾器 一致 函式和

雜湊函式 :又名雜湊函式。       布隆過濾器:1經典結構 要求的失誤率 2  原理:每個url經過K個雜湊函式在對應相應位置描黑,所有url描黑後,整個布隆過濾器相應型別的陣列相當位置描黑,之後計算K個雜湊函式對應位置,如果K個雜湊函

擴充套件【點陣】,海量資料處理

點陣圖: 它是用一個bit位來標識一個整數存在或者不存在,一般用於大資料的簡單確認是否存在 類似於雜湊的直接定址法,只不過點陣圖定在了一個位上,用bit上的0和1來標識一個數字存在或者不存在哈哈 typedef struct BitMap {

大量資料去重:Bitmap點陣演算法和過濾器(Bloom Filter)

Bitmap演算法 與其說是演算法,不如說是一種緊湊的資料儲存結構。是用記憶體中連續的二進位制位(bit),用於對大量整型資料做去重和查詢。其實如果並非如此大量的資料,有很多排重方案可以使用,典型的就是雜湊表。 實際上,雜湊表為每一個可能出現的數字提供了一個一一對映的關係,每個元素都相當於有

擴充套件——過濾器

一、基本原理:      對於原理來說很簡單,位陣列+k個獨立hash函式。將hash函式對應的值的位陣列置1,查詢時如果發現所有hash函式對應位都是1說明存在,但是這個過程並不能保證查詢的結果是100%正確的。 二、要點: 刪除 &nb

資料結構--擴充套件 ( 過濾器 )

布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。 基本概念 : 如果想

資料結構】點陣BitMap與過濾器BloomFilter

  首先先看一下下面這個騰訊的面試題:給40億個不重複的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中。 【騰訊】思路一:  最容易想到的解法就是遍歷所有的40多億個整數,然後一個一個判斷。但是這個需要花費的記憶體是多大呢?  大家可以去算一下

資料結構】過濾器——點陣擴充套件

本篇博文,旨在介紹一種可以快速檢索元素是否存在的資料結構 --- 布隆過濾器;本文從點陣圖和布隆過濾器的對比,討論了使用這兩種資料結構的不同情況;並介紹了布隆過濾器的幾種主要使用場景 布隆過濾器的引入 之前學習了點陣圖,可以快速的判斷一個整數是否存在於一個集合中 然而,現

過濾器、一致性演算法總結

認識布隆過濾器 不安全網頁的黑名單包含 100 億個黑名單網頁,每個網頁的 URL 最多佔用 64B。 現在想要實現一種網頁過濾系統,可以根據網頁的 URL 判斷該網頁是否在黑名單上,請設計該系統。 1.該系統允許有萬分之一以下的判斷失誤率。 2.使用的額外空間不要超過 3

點陣過濾器

給四十億個不重複的無符號整數,再給你一個無符號整數,如何快速 判斷一個數是否在這四十億個數中? 1byte=8bit; 1kB=1024byte; 1MB=1024KB; 1GB=1024MB; 1GB大約有10億多個位元組,而40億個無符號整數有1

點陣(bitmap)的理解及應用例項 過濾

點陣圖是記憶體中連續的二進位制位,用於大量整型數的查詢和去重。 比如,給定10bit的記憶體空間,要將{5,3,4,7}插入其中。 則,先將第5位置1, 再將3,4,7 依次置1。 這樣,此時bitmap中儲存了哪些元素,就一目瞭然。 bitmap

第三百五十八節,Python分式爬蟲打造搜索引擎Scrapy精講—將bloomfilter(過濾器)集成到scrapy-redis中

分布式爬蟲 times 操作 加載 ger 目錄 需要 ini space 第三百五十八節,Python分布式爬蟲打造搜索引擎Scrapy精講—將bloomfilter(布隆過濾器)集成到scrapy-redis中,判斷URL是否重復 布隆過濾器(Bloom Filte

BloomFilter(過濾器)

但是 同時 see oom font 關聯 代碼實現 filter func 原文鏈接:http://blog.csdn.net/qq_38646470/article/details/79431659 1.概念: 如果想判斷一個元素是不是在一個集合裏,一般想到的是將所有元

Bloom Filter過濾器

布隆過濾器 數據及結構 原文鏈接:http://blog.csdn.net/qq_38646470/article/details/794316591.概念:如果想判斷一個元素是不是在一個集合裏,一般想到的是將所有元素保存起來,然後通過比較確定。鏈表,樹等等數據結構都是這種思路. 但是隨著集合中元素的

Bloom filter(過濾器)概念與原理

概念 int 復雜 gravity water pac 基數 AS class https://en.wikipedia.org/wiki/Bloom_filter 寫在前面 在大數據與雲計算發展的時代,我們經常會碰到這樣的問題。我們是否能高效的判斷一個用

使用MR編程hbase和hbase調優-過濾器

style zook 存儲空間 del 使用 字節數 permsize 判斷 enabled 使用MR編程操縱hbase ====================================== 1、TableInputFormat輸入K,V格式