C++:Hash拓展--布隆過濾器

布隆過濾器

問題前景:

之前學習了位圖,我們知道位圖在大量數據查找時候是很方便的。但位圖的缺陷在于只能用于整型數據。而在實際中,我們的數據更多的是更復雜的字符串或者自定義類型。那么此時位圖就顯得有點無力,所以就誕生了叫布隆過濾器的數據結構。

布隆過濾器:

布隆過濾器(Bloom Filter)是一種空間效率極高的概率型數據結構,主要用于快速判斷一個元素是否“可能存在于”一個集合中,或者“絕對不存在于”集合中。

那可能會有疑問,為什么布隆過濾器需要映射多個值,而不只映射單個值呢?

假設我們現在需要查找名字為胡歌,此時就存在Hash沖突,胡歌明明沒有插入數據,但顯示已經在布隆過濾器里了,存在誤判。

而我們使用多個Hash函數進行分別插入,雖然不能完全解決這個問題,但是可以大大降低誤判率。

在映射的K個位置里,只要有其中一個不在,該元素就是不存在。

只有映射的K個位置里,全部在,才可能在(存在誤判風險)。

布隆過濾器理論結論:

布隆過濾器的推到,這里小編就不細講了,大家有興趣可以自行搜索。小編就簡單說下結論

當哈希函數固定時,插入的數據增加,誤判率增加。開的比特位增加,誤判率就減少。

判斷一個數不在是準確的,判斷一個數在是不準確的。

布隆過濾器代碼實現:

#pragma once
#include<iostream>
#include<vector>
#include<string>using namespace std;template<size_t size>
class BitMap
{
public:BitMap(){_bm.resize(size);}void set(size_t x){int i = x / 32;int j = x % 32;_bm[i] |= (1 << j);}bool test(size_t x){int i = x / 32;int j = x % 32;return _bm[i]&(1 << j);}private:vector<size_t> _bm;
};struct HashFuncBKDR
{size_t operator()(const string& s){size_t hash = 0;for (auto ch : s){hash *= 31;hash += ch;}return hash;}
};
struct HashFuncAP
{size_t operator()(const string& s){size_t hash = 0;for (size_t i = 0; i < s.size(); i++){if ((i & 1) == 0) {hash ^= ((hash << 7) ^ (s[i]) ^ (hash >> 3));}else {hash ^= (~((hash << 11) ^ (s[i]) ^ (hash >>5)));}}return hash;}
};
struct HashFuncDJB
{size_t operator()(const string & s){size_t hash = 5381;for (auto ch : s){hash = hash * 33 ^ ch;}return hash;}
};template<size_t N, size_t X = 5, class K=string,class Hash1= HashFuncBKDR,class Hash2= HashFuncAP,class Hash3= HashFuncDJB>
class Blomm_fiter
{
public:void set(const K&key){size_t hash1 = Hash1()(key) % M;size_t hash2 = Hash2()(key) % M;size_t hash3 = Hash3()(key) % M;_bm.set(hash1);_bm.set(hash2);_bm.set(hash3);}bool test(const K&key){size_t hash1 = Hash1()(key) % M;size_t hash2 = Hash2()(key) % M;size_t hash3 = Hash3()(key) % M;if(!_bm.test(hash1)){return false;}if (!_bm.test(hash2)){return false;}if (!_bm.test(hash3)){return false;}return true;//不一定準確}// 獲取公式計算出的誤判率double getFalseProbability(){double p = pow((1.0 - pow(2.71, -3.0 / X)), 3.0);return p;}private:static const size_t M = N * X; //M為實際需要開的數據BitMap<M> _bm;
};

代碼解釋:

類模板定義:

N為傳入的數據大小,X為倍數,用于求出M,K為模板類型,剩下的就是哈希函數。這里為了簡單實現,就寫死哈希函數,在實際實現中,哈希函數可以進行動態調整多少。

成員變量:

M需要開多少個比特位

_bm就是普通位圖,因為布隆過濾器或許還是會轉成int類型進行映射。我們這里直接套用即可。

Setsize_t x

使用多個哈希函數求出映射的位置,并調用_bm的函數set進行置1

Test(size_t x)

該函數為布隆過濾器核心,當有一個不在就是不在,這個是準確的。當全部在的時候可能在,這個是不準確的。

測試代碼:

通過測試代碼,就能很直觀的看出,我們可以通過控制X(倍數)的大小,進行控制誤判率。X越小誤判率越大,X越大誤判率越小。

布隆過濾器的實際應用:

布隆過濾器的優勢(空間小、查詢快、“不存在”判斷準)使其非常適合用于需要快速過濾掉大量“肯定不存在”的請求的場景,尤其當數據量巨大且對少量誤判可以容忍時: ?

緩存穿透防護: ?

問題:查詢一個不存在的數據,導致請求繞過緩存直接沖擊底層數據庫(如Redis、MySQL)。 ?

解決:將所有可能存在的緩存鍵(或數據庫主鍵)放入布隆過濾器。查詢時先查布隆過濾器:

若返回“不存在”,則直接返回空或錯誤,避免查數據庫。 ?

若返回“可能存在”,再去查緩存/數據庫。即使有少量誤判(查了數據庫但沒結果),也比所有不存在請求都查數據庫要好得多。 ?

網絡爬蟲的URL去重: ?

問題:避免重復抓取同一個URL。 ?

解決:將已抓取或計劃抓取的URL放入布隆過濾器。

新URL來臨時: ?

查布隆過濾器:若返回“不存在”,則一定是新URL,加入抓取隊列并添加到過濾器。 ?

若返回“可能存在”,則大概率是重復URL(即使有小概率誤判是新URL,放棄抓取也是可以接受的代價)。 ?

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

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

相關文章

快速了解JVM中的深堆與淺堆

在Java虛擬機&#xff08;JVM&#xff09;的內存管理世界里&#xff0c;深堆與淺堆是兩個重要的概念。它們如同衡量對象內存占用的兩把標尺&#xff0c;對于優化程序性能、排查內存泄漏問題起著關鍵作用。接下來&#xff0c;讓我們快速且深入地了解它們。 一、淺堆&#xff08…

開疆智能ModbusTCP轉Devicenet網關連接FANUC機器人配置案例

本案例是ModbusTCP主站通過開疆智能ModbusTCP轉Devicenet網關連接發那科機器人的配置案例&#xff0c;操作分為三個配置1&#xff1a;ModbusTCP主站配置2&#xff1a;ModbusTCP轉Devicenet網關配置3&#xff1a;FANUC機器人配置&#xff0c;具體過程如下 配置過程 主菜單—IO—…

詳解RabbitMQ高級特性之發送方確認機制

目錄 發送方確認 添加配置 常量類 聲明隊列和交換機并綁定二者關系 confirm確認模式 編寫生產消息代碼 生產消息1 解決方法 多次生產消息2 解決方法 生產消息3 return 模式 編寫生產消息代碼&#xff08;路由正確&#xff09; 生產消息1 編寫生產消息代碼&…

Google Play開發者賬號8.3/10.3政策違規自救指南

最近&#xff0c;有一位開發者焦急地向我們訴說&#xff0c;其辛苦開發的多個應用&#xff0c;毫無征兆地全部下架&#xff0c;賬戶提示違反政策 8.3 和 10.3。經過連夜排查&#xff0c;原來是換皮應用與誤導性描述導致的問題。 這并非個例&#xff0c;在 2024 年&#xff0c;G…

pythonday50

作業&#xff1a; 1.好好理解下resnet18的模型結構 2.嘗試對vgg16cbam進行微調策略 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torchvision import models from torch.utils.d…

天貓618高增長背后:電商邁入價值戰新周期

作者 | 曾響鈴 文 | 響鈴說 這次618&#xff0c;來“真”的了。 天貓618玩法變得極致簡單&#xff0c;只設了“官方立減”的85折的基礎優惠&#xff0c;再疊加行業品類券、國補等優惠&#xff0c;最高立減可達50%&#xff0c;十分直觀。 讓消費者省心的結果也是顯而易見的&…

tauri+vue自動更新客戶端打包配置

拉取最新代碼打開項目根目錄下"~.tauri\myapp.key"文件并復制內容 打開項目的powershell窗口&#xff0c;輸入如下內容并回車 $env:TAURI_SIGNING_PRIVATE_KEY"復制的myapp.key" $env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD""然后修改tauri.conf.…

硬件------51單片機

一.基本概念 1.裸機程序 BSP BSP&#xff1a;bord suppord pack 板級支持包 就是程序編寫的內容是沒有操作系統的&#xff0c;直接通過代碼去控制寄存器&#xff0c;讓硬件按照要求去工作。 主要內容&#xff1a;51單片機 IMAX6ULL 2.linux驅動部分 在裸機BSP程序的基礎…

java 基礎方法 list分頁

新增一個list 泛型分類方法 hutools沒這個方法, mybatis 里面的方法不好用 故新增此方法 package com.common.base.util.page;import lombok.Data;import java.util.List;/*** className: VoPage* description: list分頁* author: chenyuanlong* date: 2025年6月16日 0016 上午…

操作系統期末復習--操作系統初識以及進程與線程

操作系統概念與主要功能 操作系統的概念 在信息化時代&#xff0c;軟件是計算機系統的靈魂&#xff0c;而作為軟件核心的操作系統&#xff0c;已與現代計算機系統密不可分、融為一體。計算機系統自下而上大致分為4部分&#xff1a;硬件、操作系統、應用程序和用戶 操作系統管…

使用jhat查看dump.hprof文件內具體對象的屬性值信息

jhat是JDK自帶的堆轉儲分析工具&#xff0c;可以用來查看.hprof文件中對象的具體內容。本文演示使用的是JKD8. 一、啟動jhat 執行啟動命令。 jhat -J-Xmx4g your_heap_dump.hprof -J-Xmx4g表示為jhat分配4GB內存&#xff0c;根據你自己情況調整大小。your_heap_dump.hprof是…

freeRTOS之隊列(queue)

一.概述 1.介紹 隊列(queue)可以用于"任務到任務"、“任務到中斷”、"中斷到任務"直接傳輸信息。 2.核心功能 線程安全&#xff1a;自動處理多任務訪問時的互斥問題。 數據復制&#xff1a;入隊時復制數據&#xff08;而非引用&#xff09;&#xff0c;…

【python】typing用法

一、基礎類型提示 1. 基本類型注解 # 變量類型注解 age: int 30 name: str "Alice" is_student: bool False height: float 1.752. 函數注解 def greet(name: str, age: int) -> str:return f"Hello {name}, you are {age} years old!"二、組合類…

web前端開發核心基礎:Html結構分析,head,body,不同標簽的作用

前端技術協同關系 協作流程&#xff1a;HTML構建頁面框架—>css美化樣式&#xff08;選擇器屬性&#xff09;—>JavaScript實現交互&#xff08;類似于python的腳本語言&#xff09;擴展基礎&#xff1a;在上面三項基礎上學習Vue\React、構建工具WePack和瀏覽器工作原理…

精益數據分析(105/126):移動應用核心指標解析與用戶分層營收策略

精益數據分析&#xff08;105/126&#xff09;&#xff1a;移動應用核心指標解析與用戶分層營收策略 在移動應用市場競爭白熱化的今天&#xff0c;單純追求下載量已無法保證商業成功&#xff0c;精細化運營核心指標成為盈利關鍵。本文將深入解析每日活躍用戶平均營收&#xff…

被CC攻擊了,對服務器有什么影響?

博客正文&#xff1a; 最近&#xff0c;不少網站管理員和運維人員反映遭遇了CC攻擊&#xff0c;導致服務器性能異常甚至癱瘓。那么&#xff0c;CC攻擊究竟會對服務器造成哪些影響&#xff1f;本文將為你簡要解析CC攻擊的原理及其帶來的危害&#xff0c;幫助你更好地理解并應對…

Tensorflow安裝出現dependency conflict錯誤

Python版本&#xff1a; 3.11.4 pip版本已升到最新 電腦上有mac的原裝Python2.x&#xff0c;我裝的3.11.4&#xff0c;還有個什么依賴的3.9 運行 pip3 install tensorflow 出現類似以下錯誤 &#xff08;我報錯的是另一個不是tensorflow—estimator&#xff0c;但基本就是…

2025年HTTP半開與錯誤攻擊防御指南:原理拆解與實戰防護

你以為限流就能防住HTTP攻擊&#xff1f;黑客用協議畸形包AI調度正在撕裂傳統防線&#xff01; 一、HTTP半開攻擊&#xff1a;慢速絞殺服務器資源 ? 攻擊原理剖析 HTTP半開攻擊&#xff08;如Slowloris&#xff09;是一種應用層DoS攻擊&#xff0c;通過建立大量半開連接耗盡…

Mybatis(XML映射文件、動態SQL)

目錄 基礎操作 準備&#xff1a; 刪除&#xff1a; 新增&#xff1a; 更新&#xff1a; 查詢&#xff1a; 條件查詢&#xff1a; XML映射文件 動態SQL if foreach sql&include 基礎操作 準備&#xff1a; 準備數據庫表 創建一個新的springboot工程&#xff0…

python校園拼團系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…