日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? 布隆過濾器是一種判定元素是否存在于集合中的方法。其基本原理是使用哈希方法將數據映射到一個很長的向量上。在維基百科上,它被稱為“空間效率和查詢時間都遠遠超過一般的算法”的方法。由于它只保存散列的數據,所以對于很長的數據有著良好的壓縮特性,這個是個不爭的事實(可以參見《布隆過濾器 (Bloom Filter) 詳解》)。但是其查詢效率究竟如何,我們還是要實際測試一下。(轉載請指明出于breaksoftware的csdn博客)

? ? ? ? 我們選用unordered_multiset作為對比對象,是因為在《C++拾趣——STL容器的插入、刪除、遍歷和查找操作性能對比(ubuntu g++)——遍歷和查找》中,實驗驗證它的查詢效率是最高的。

? ? ? ? 由于布隆過濾器存在以下特性:

  • 判定不存在的一定不存在
  • 判定存在的可能不存在

? ? ? ? 實驗分為兩部分:

  1. 查找集合中不存在的元素
  2. 查找集合中存在的元素

? ? ? ? 由于布隆過濾器存在一定的誤算率,所以在1的場景下,存在判定元素存在的可能性(存在誤算率)。

? ? ? ? 我們使用的是https://github.com/ArashPartow/bloom版本的實現,它可以指定誤算率。

? ? ? ? 由于散列計算需要時間,所以數據的長度也將是一個比較因子。于是上述每個實驗都有三個影響因素

  1. 誤算率
  2. 集合大小
  3. 數據長度

查找集合中不存在的元素? ? ?

不同數據長度

? ? ? ? 在集合大小(65536)和誤算率(0.1)確定的情況下,我們比較不同數據長度下,unordered_multiset、bloomfilter的構建,和它們查找1024個不存在的元素的時間消耗。

構建時間

? ? ? ??可以見得,查找(search)時間比構建(build)時間要少很多。

? ? ? ? 當數據長度小于500時,bloomfilter比unordered_multiset構建時間要短。但是隨著數據長度的增長,前者將花費更多的時間。也就是說unordered_multiset和bloomfilter的構建時間都符合線性增長規律,但是unordered_multiset初始耗時比bloomfilter要長,但是其增長系數比后者小。

查找時間

? ? ? ? 再看下查找(search)時間? ??

? ? ? ? 在數據長度低于80時,bloomfilter比unordered_multiset要快。但是隨著數據長度的增加,前者越來越慢。當數據長度達到30000時,存在2倍多的差距。

? ? ? ? 隨著數據長度增加,bloomfilter的查找時間比unordered_multiset要長。

? ? ? ? 上述趨勢規律在數據個數比較小時也適合,只是交叉點有所變化

不同集合大小

? ? ? ? 在數據長度(256)和誤算率(0.1)確定的情況下,我們比較不同集合大小時,unordered_multiset、bloomfilter的構建,和它們查找1024個不存在的元素的時間消耗。

構建耗時

? ? ? ? 在相同數據長度的情況下,bloomfilter比unordered_multiset構建速度要快些,而且隨著集合個數增長,其優勢更加明顯。

查找時間

? ? ? ? 當集合個數少于1,000,000個時,bloomfilter的查找還是比unordered_multiset慢,但是unordered_multiset隨著集合大小增長會越來越慢。一旦超過閥值,unordered_multiset就永遠比bloomfilter要慢了。而bloomfilter的查找速度一直比較穩定。

不同誤算率

? ? ? ? 在數據長度(256)和集合個數(1048576)確定的情況下,我們比較不同誤算率下,unordered_multiset、bloomfilter的構建,和它們查找1024個不存在的元素的時間消耗。

構建時間

? ? ? ? 因為unordered_multiset和誤算率沒有關系,而且數據長度和集合大小固定,所以它幾乎是條直線。但是我們看到隨著誤算率的降低,bloomfilter的構建速度也在變慢。

查找時間

? ? ? ? 由于unordered_multiset和誤算率無關,所以其查找時間也幾乎是條直線。但是隨著誤算率降低,bloomfilter的查找時間越來越高。

查找集合中存在的元素

? ? ? ? 經過實驗,其結果和“查找集合中不存在的元素”規律一致,這兒就不把圖再羅列了。

總結:

  1. 隨著集合個數增長,unordered_multiset的查找速度越來越慢。而bloomfilter比較穩定。個數較少時bloomfilter比unordered_multiset慢,但是超過一定閥值,bloomfilter將比unordered_multiset快。
  2. 隨著數據長度增長,bloomfilter的查找速度越來越慢。而且速度比unordered_multiset慢較多。
  3. 隨著誤算率降低,bloomfilter的查找速度越來越慢。
  4. 除了內存因素外,檢測bloomfilter是否是適合應用場景,需要基于上面三個因素做實驗之后才能判斷。

? ? ? ? 測試代碼和生成圖的代碼見https://github.com/f304646673/test_bloomfilter

總結

以上是生活随笔為你收集整理的C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。