海量數據處理(位圖和布隆過濾器)

哈希切割

給一個超過100G大小的log file, log中存著IP地址, 設計算法找到出現次數最多的IP地址? 與上題條件相同,如何找到top K的IP?如何直接用Linux系統命令實現

解決思路

找到出現次數最多的IP地址

要找到前TopK的IP地址,就是要統計每個IP地址出現多少次
分割大文件:如果能將相同IP地址放到同一個文件中
哈希分割: 從源文件中獲取一個IP地址---->IP%文件份數

  1. 每拿到一個IP地址后,用函數把IP地址轉化為整型數據,再%上文件分數,就知道把IP地址放到哪個文件中去
  2. 這樣,就可以統計每個IP地址出現多少次
//構建鍵值對
<IP地址的整型數據,次數>
  1. 統計哪個IP地址出現的次數比較多,用unordered_map,m[ip]++;每拿到一個IP地址的++。每個IP地址出現的次數,已經在unordered_map中保存起來
  2. 按類似的方法,統計每個文件中的IP地址的次數,最后用一個for()---->找出出現最多的IP地址

top K的IP

堆---->最多前K個IP地址—><次數,IP地址>

位圖

給40億個不重復的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中。

  1. 遍歷,時間復雜度O(N)
  2. 排序(O(NlogN)),利用二分查找: logN

位圖解決

數據是否在給定的整形數據中,結果是在或者不在,剛好是兩種狀態,那么可以使用一個二進制比
特位來代表數據是否存在的信息,如果二進制比特位為1,代表存在,為0代表不存在。比如:
40億的整型數據大概是16G的數據
用位圖來映射的話 大概就是232-23=512M
在這里插入圖片描述

解決

C++中提供了位圖的類,bitset
在這里插入圖片描述

位圖的實現

#pragma once
#include<vector>
#include<iostream>
using namespace std;
namespace LXY
{class bitset{public:bitset(size_t bitCount):_set(bitCount/8 + 1), _bitCount(bitCount){}//置1操作void set(size_t which){//如果位集合給出100個比特位,那么你給100,就表示不了,范圍為0~99if(which >= _bitCount)return;//計算對應的字節size_t index = (which >> 3);//除以8size_t pos = which % 8;//先將1移到對應的比特位上,再或上對應位上的數字_set[index] |= (1 << pos);}//置0操作void reset(size_t which){if (which >= _bitCount)return;//計算對應的字節size_t index = (which >> 3);//除以8size_t pos = which % 8;//先將1的取反0移到對應的比特位上,再與上對應位上的數字_set[index] &= ~(1 << pos);}//檢測which比特位是否為1bool test(size_t which){if (which >= _bitCount)return false;//計算對應的字節size_t index = (which >> 3);//除以8size_t pos = which % 8;//與上1不等于0就代表存在return 0 != (_set[index] & (1 << pos));}//返回比特位總的個數size_t size(){return _bitCount;}//返回為1的比特位的總數size_t count(){//查表int bitCnttable[256] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2,3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3,3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3,4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4,3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5,6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4,4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5,6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3,4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6,6, 7, 6, 7, 7, 8 };size_t szcount = 0;for (size_t i = 0; i < _set.size(); ++i)szcount += bitCnttable[_set[i]];return szcount;}public:std::vector<unsigned char> _set;size_t _bitCount;};
}void TestBitSet()
{LXY::bitset bt(100);bt.set(10);bt.set(20);bt.set(30);bt.set(40);bt.set(41);cout << bt.size() << endl;cout << bt.count() << endl;if (bt.test(40))cout << "40bite is 1" << endl;elsecout << "40bite is not 1" << endl;bt.reset(40);cout << bt.count() << endl;if (bt.test(40))cout << "40bite is 1" << endl;elsecout << "40bite is not 1" << endl;
}int main()
{TestBitSet();system("pause");return 0;
}

位圖的應用

  1. 快速查找某個數據是否在一個集合中
  2. 排序 (數據不能有重復)
  3. 求兩個集合的交集、并集等
  4. 操作系統中磁盤塊標記

位圖的題

  1. 給定100億個整數,設計算法找到只出現一次的整數?
    用兩個比特位表示一個數據,8/2=4;那么位圖中一個字節只能表示4個數據,232/22=1G。
    取一個數據:哪個字節 哪兩個比特位
	if(00) //出現過0次01else if(01) //出現過多次10
  1. 位圖應用變形:1個文件有100億個int,1G內存,設計算法找到出現次數不超過2次的所有整數

布隆過濾器

位圖+哈希函數
特點是高效地插入和查詢,可以用來告訴你 “某樣東西一定不存在或者可能存在”,它是用多個哈希函數,將一個數據映射到位圖結構中。此種方式不僅可以提升查詢效率,也可以節省大量的內存空間。多個比特位代表數據的狀態信息

布隆過濾器插入

如果向布隆過濾器中插入baidu,我們用三個哈希函數將三個位置置為1
在這里插入圖片描述
在這里插入圖片描述
“baidu”---->1 4 7
“tecent”---->3 4 8
hash1,hash2,hash3----->三個位置
檢測三個位置的狀態
如果三個位置只要有一個為0,說明數據一定不存在

布隆過濾器的查找

布隆過濾器的思想是將一個元素用多個哈希函數映射到一個位圖中,因此被映射到的位置的比特位一定為1。所以可以按照以下方式進行查找:分別計算每個哈希值對應的比特位置存儲的是否為零,只要有一個為零,代表該元素一定不在哈希表中,否則可能在哈希表中
布隆過濾器如果告訴你數據不存在,那么一定不存在,如果告訴你存在,則有可能存在。

布隆過濾器的插入和查找的實現

#pragma once
#include"biteset.hpp"
#include<iostream>
#include"Common.hpp"
using namespace std;//BloomFilter:位圖+多個哈希
template<class T,class HF1 = Str2INT ,class HF2 = Str2INT2,class HF3 = Str2INT3,class HF4 =Str2INT4,class HF5 = Str2INT5>
//哈希函數給的越多,將來產生誤報的概率就也就越小
class BloomFilter
{
public:BloomFilter(size_t size = 10):_bt(10 * size), _size(0){}bool Insert(const T& data){//HF1()(data)可能回越界,要%上位圖的比特位數size_t index1 = HF1()(data) % _bt.size();size_t index2 = HF2()(data) % _bt.size();size_t index3 = HF3()(data) % _bt.size();size_t index4 = HF4()(data) % _bt.size();size_t index5 = HF5()(data) % _bt.size();_bt.set(index1);_bt.set(index2);_bt.set(index3);_bt.set(index4);_bt.set(index5);_size++;return true;}//檢測是否存在,每個哈希函數都得檢測bool IsIn(const T&data){size_t index = HF1()(data) % _bt.size();if (!_bt.test(index))return false;index = HF2()(data) % _bt.size();if (!_bt.test(index))return false;index = HF3()(data) % _bt.size();if (!_bt.test(index))return false;index = HF4()(data) % _bt.size();if (!_bt.test(index))return false;index = HF5()(data) % _bt.size();if (!_bt.test(index))return false;//元素可能存在return true;}//存儲多少個元素size_t count()const{return _size;}
private:LXY::bitset _bt;size_t _size;
};

布隆過濾器的刪除

布隆過濾器不能直接支持刪除工作,因為在刪除一個元素時,可能會影響其他元素
一種支持刪除的方法:將布隆過濾器中的每個比特位擴展成一個小的計數器(整型數組),插入元素時給k個計數器(k個哈希函數計算出的哈希地址)加一,刪除元素時,給k個計數器減一,通過多占用幾倍存儲空間的代價來增加刪除操作。

缺陷:
  1. 無法確認元素是否真正在布隆過濾器中
  2. 存在計數回繞

布隆過濾器優點

  1. 增加和查詢元素的時間復雜度為:O(K), (K為哈希函數的個數,一般比較小),與數據量大小無關
  2. 哈希函數相互之間沒有關系,方便硬件并行運算
  3. 布隆過濾器不需要存儲元素本身,在某些對保密要求比較嚴格的場合有很大優勢
  4. 在能夠承受一定的誤判時,布隆過濾器比其他數據結構有這很大的空間優勢
  5. 數據量很大時,布隆過濾器可以表示全集,其他數據結構不能
  6. 使用同一組散列函數的布隆過濾器可以進行交、并、差運算

布隆過濾器缺陷

  1. 有誤判率,即存在假陽性(False Position),即不能準確判斷元素是否在集合中(補救方法:再建立一個白名單,存儲可能會誤判的數據)
  2. 不能獲取元素本身
  3. 一般情況下不能從布隆過濾器中刪除元素
  4. 如果采用計數方式刪除,可能會存在計數回繞問題

布隆過濾器

  1. 給兩個文件,分別有100億個query,我們只有1G內存,如何找到兩個文件交集?分別給出精確算法和近似算法
    答:給一個布隆過濾器,將一個文件的數據映射里面去。如果整體映射不完,先映射一部分。從另外一個文件拿一個數據在布隆過濾器里面找,如果有,數據存在就算是兩個文件的交集。

倒排索引

給上千個文件,每個文件大小為1K—100M。給n個詞,設計算法對每個詞找到所有包含它的文件,你只有100K內存

哈希加密

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/383095.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383095.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383095.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++11新特性的總結

C11新特性 auto關鍵字(C11&#xff09;基于范圍的for循環(C11&#xff09;. 指針空值nullptr(C11&#xff09;C動態內存管理序列式容器 array forward_list;繼承和多態:final overridedelete:不生成默認的成員函數default:強制編譯器生成默認的成員函數智能指針:unique_ptr,sh…

詳解C++中右值引用

98中的引用 概念特性引用的使用場景三種傳參方式效率的比較探索:引用的底層實現方式----->指針 T&------>T* constconst T&---->const T*const 引用和指針的區別 引用的總結 11中的右值引用 為什么要有右值引用 為了提高程序運行效率&#xff0c;C11中引…

C++中的lambda表達式和線程庫

98中的一個例子 如果想要對一個數據集合中的元素進行排序&#xff0c;可以使用std::sort方法 #include <algorithm> #include <functional> int main() {int array[] {4,1,8,5,3,7,0,9,2,6};// 默認按照小于比較&#xff0c;排出來結果是升序std::sort(array, a…

文件壓縮(Huaffman樹的概念及其實現)

什么是壓縮 想辦法讓源文件變得更小并能還原。 為什么要進行文件壓縮 文件太大&#xff0c;節省空間提高數據再網絡上傳輸的效率對數據有保護作用—加密 文件壓縮的分類 無損壓縮 源文件被壓縮后&#xff0c;通過解壓縮能夠還原成和源文件完全相同的格式 有損壓縮 解壓縮之…

詳解STL中的空間配置器(SGI版本)

空間配置器 1.什么是空間配置器 為各個容器高效的管理空間(空間的申請與回收)的 2.為什么需要空間配置器 各種容器----->可以存放元素---->底層需要空間 new 申請空間 operator new ---->malloc調用構造函數------完成對象的構造 動態內存管理總結 前面的容器…

【劍指offer】_15數組中重復的數字

題目描述 在一個長度為n的數組里的所有數字都在0到n-1的范圍內。 數組中某些數字是重復的&#xff0c;但不知道有幾個數字是重復的。也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。 例如&#xff0c;如果輸入長度為7的數組{2,3,1,0,2,5,3}&#xff0c;那么對應的…

【劍指offer】_16 構建乘積數組

題目描述 給定一個數組A[0,1,…,n-1],請構建一個數組B[0,1,…,n-1],其中B中的元素B[i]A[0]*A[1]*...*A[i-1]*A[i1]*...*A[n-1]。不能使用除法。 解題思路 設有數組大小為5。 對于第一個for循環 第一步&#xff1a;b[0] 1; 第二步&#xff1a;b[1] b[0] * a[0] a[0] 第三…

【劍指offer】_17正則表達式的匹配

題目描述 請實現一個函數用來匹配包括’.‘和*的正則表達式。模式中的字符’.表示任意一個字符&#xff0c;而*表示它前面的字符可以出現任意次&#xff08;包含0次&#xff09;。 在本題中&#xff0c;匹配是指字符串的所有字符匹配整個模式。例如&#xff0c;字符串"aaa…

大四階段的社會實踐的主要目的是_疫情當前,大三大四的學生“很慘”?大一大二的學生也別松懈...

大四畢業生不容易這次疫情對于高校學生而言&#xff0c;可以說是各有各的難處&#xff0c;“這屆畢業生很慘”更是屢上熱搜。不可否認&#xff0c;大四畢業生確實很不容易&#xff0c;論文答辯、畢業、求職就業等都受到了影響&#xff0c;雖然有困難&#xff0c;但各方都在積極…

【劍指offer】_18 數據流中的中位數

題目描述 如何得到一個數據流中的中位數&#xff1f;如果從數據流中讀出奇數個數值&#xff0c;那么中位數就是所有數值排序之后位于中間的數值。如果從數據流中讀出偶數個數值&#xff0c;那么中位數就是所有數值排序之后中間兩個數的平均值。我們使用Insert()方法讀取數據流…

【劍指offer】_19 滑動窗口中的最大值

題目描述 給定一個數組和滑動窗口的大小&#xff0c;找出所有滑動窗口里數值的最大值。例如&#xff0c;如果輸入數組{2,3,4,2,6,2,5,1}及滑動窗口的大小3&#xff0c;那么一共存在6個滑動窗口&#xff0c;他們的最大值分別為{4,4,6,6,6,5}&#xff1b; 針對數組{2,3,4,2,6,2,…

android 文字反轉_多文字共享信息系統

歐陽貴林 www.HeZi.net首發表于2016年03月23日“ 處在信息時代的開端&#xff0c;信息技術不應有特殊的文字性&#xff0c;需要創建多文字共享信息系統&#xff0c;給各國文字一個公平的參與信息與科技創新發展的平臺。這是世界的事&#xff0c;更是中國事。”01人類語言語言文…

LeetCode【1--兩數之和】 LeetCode【2--兩數相加】

兩數之和 題目描述 給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那 兩個 整數&#xff0c;并返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;你不能重復利用這個數組中同樣的元素。 解題思路 直接兩…

input數字開頭不能為0_李商隱為初戀寫詩,每句以數字開頭,最后10字一直被仿從未被超越...

上學時&#xff0c;每次寫作文&#xff0c;老師總愛在耳邊念叨&#xff1a;“你的作文得讓閱卷老師看得懂&#xff0c;不然不可能給你高分的&#xff01;”每次聽到話&#xff0c;筆者總是用李商隱的詩來和他斗嘴。是的&#xff0c;李商隱的詩作常常是讓人讀不懂的&#xff0c;…

lsass.exe 當試圖更新密碼時_“驅動人生”下載器木馬再度更新-你應該注意什么?...

360安全大腦監測到通過"驅動人生"供應鏈攻擊傳播的挖礦木馬在1月30日下午4時左右再次更新。此次更新中&#xff0c;木馬在此前抓取系統帳戶密碼的基礎上增加了抓取密碼hash值的功能&#xff0c;并試圖通過pass the hash攻擊進行橫向滲透&#xff0c;使得該木馬的傳播…

LeetCode【3--無重復的最長字串】 LeetCode【4--有序數組中的中位數】

無重復的最長字串 題目描述 給定一個字符串&#xff0c;請你找出其中不含有重復字符的 最長子串 的長度。 解題思路 看到這道題&#xff0c;其實就兩個步驟&#xff0c;遍歷字符串&#xff0c;記錄當前字符有沒有重復。 重復一般解決就是哈希&#xff0c;這里用個數組表示…

hwt字體轉換ttf_五分鐘教你弄懂了字體反爬是個啥

今天的文章內容主要是關于字體反爬。目前已知的幾個字體反爬的網站是貓眼&#xff0c;汽車之家&#xff0c;天眼查&#xff0c;起點中文網等等。以前也看過這方面的文章&#xff0c;今天跟個老哥在交流的時候&#xff0c;終于實操了一把&#xff0c;弄懂了字體反爬是個啥玩意。…

LeetCode【5--最長的回文子串】 LeetCode【6--Z字形變換】

最長的回文子串 題目描述 給定一個字符串 s&#xff0c;找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。 解題思路 可以跟無重復的最長子串一樣&#xff0c;用一個滑動窗口&#xff0c;只不過這個窗口的右邊界往右&#xff0c;左邊界每回要從右邊界的下標往左…

androidstudio 日歷視圖怎么顯示農歷_中秋國慶旅游攻略怎么做?用這個便簽軟件很簡單...

九月已經到來&#xff0c;中秋節和國慶節距離我們也不遠了&#xff0c;今年的中秋和國慶節重疊了有足足八天的假期。不少人都想趁著這個小長假出門旅游&#xff0c;要想保證旅游質量&#xff0c;那么就要做好攻略。中秋國慶旅游攻略怎么做&#xff1f;要想做好一份中秋國慶旅游…

c++ select函數_PySpark 操作函數一覽

PySpark 操作函數一覽Created: Sep 14, 2020 10:28 AM Tags: Big Data, PySpark, Python, SparkPyspark.sql.functionsfrom pyspark.sql import functions as F函數使用說明基本數學函數類abssin、cos、tan、asin、acos 、atan、sinh、cosh、tanhceil、round、floorexp、log、l…