欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過實(shí)例解析布隆過濾器工作原理及實(shí)例

 更新時(shí)間:2020年11月26日 15:04:11   投稿:yaominghui  
這篇文章主要介紹了通過實(shí)例解析布隆過濾器工作原理及實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

布隆過濾器

布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu),比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu)(probabilistic data structure),特點(diǎn)是高效地插入和查詢,可以用來告訴你 “一定不存在或者可能存在”。

相比于傳統(tǒng)的 List、Set、Map 等數(shù)據(jù)結(jié)構(gòu),它更高效、占用空間更少,但是缺點(diǎn)是其返回的結(jié)果是概率性的,而不是確切的。

布隆過濾器的工作原理

假設(shè)一個(gè)長度為m的bit類型的數(shù)組,即數(shù)組中每個(gè)位置只占一個(gè)bit,每個(gè)bit只有兩種狀態(tài):0,1,所有bit的初始狀態(tài)都為0。

再假設(shè)一共有k個(gè)哈希函數(shù),這些函數(shù)的輸出域大于或者等于m,并且這些哈希函數(shù),彼此之間相互獨(dú)立,每個(gè)哈希函數(shù)計(jì)算出來的結(jié)果是獨(dú)立的,可能相同也可能不相同,對每一個(gè)計(jì)算出來的結(jié)果都對m取余(%m),然后再將數(shù)組下標(biāo)位置置為1。

我們這里假設(shè)m為13,k為3的布隆過濾器,來看看布隆過濾器的工作原理:

當(dāng)我們要映射一個(gè)值到布隆過濾器時(shí),首先計(jì)算三個(gè)哈希函數(shù)的值,然后對13取余,映射到對應(yīng)位中,圖中映射到2,6,10,這樣我們就完成了一個(gè)值的映射。

那么怎么判斷一個(gè)值是否存在,當(dāng)一個(gè)值輸入時(shí),通過三個(gè)哈希函數(shù),然后取余,我們就可以得到對應(yīng)的三個(gè)位置,我們只需要判斷這三個(gè)位置是否都為1,如果都為1,則該值存儲(chǔ),反之不存在。

但是有一個(gè)特殊情況,前面說了不同的哈希函數(shù)可能計(jì)算可能相同也可能不相同,而且不同的哈希函數(shù)對不同的值計(jì)算出來的值可能一樣,這就造成一個(gè)結(jié)果,一個(gè)值通過哈希和取余得到的位置,早就被其它值給置1了,當(dāng)我們存儲(chǔ)的值過多,而這個(gè)bit數(shù)組過小,都會(huì)造成這種情況更多的發(fā)生,一個(gè)值明明不存在,而它的所有位置早就被其它不同值置1,造成了誤判,這里就對布隆過濾器提出了一個(gè)指標(biāo):失誤率p。

在同樣數(shù)據(jù)規(guī)模下,不同大小的bit數(shù)組及不同數(shù)量k的哈希函數(shù)對誤判率的結(jié)果:

如何選取最合適的m(bit數(shù)組的大?。┘発(哈希函數(shù)的數(shù)量),在已知n(需要映射的值得數(shù)量)及失誤率p的情況下:

m的選?。?/p>

k的選?。?/p>

給個(gè)例子:假設(shè)n=100億,p=0.01%

通過公式計(jì)算出來m=19.19n,向上取整位20n,即2000億個(gè)bit,也就是25gb。

通過公式計(jì)算出來k=14。

計(jì)算真實(shí)失誤率:

根據(jù)公式計(jì)算出來的真實(shí)失誤率位0.006%。

c語言實(shí)現(xiàn)

#include <stdio.h>

#define Size 100
#define BitSIZE Size * 4 * 8
//c語言中一個(gè)整型數(shù)據(jù)類型4個(gè)字節(jié) 
int bit[Size]={0};

  
int SDBMHash(char *str)
{
  unsigned int hash = 0;
  while (*str)
  {
    // equivalent to: hash = 65599*hash + (*str++);
    hash = (*str++) + (hash << 6) + (hash << 16) - hash;
  }
  return (hash & 0x7FFFFFFF);
}

int RSHash(char *str)
{
  unsigned int b = 378551;
  unsigned int a = 63689;
  unsigned int hash = 0;
 
  while (*str)
  {
    hash = hash * a + (*str++);
    a *= b;
  }
 
  return (hash & 0x7FFFFFFF);
}

int JSHash(char *str)
{
  unsigned int hash = 1315423911;
 
  while (*str)
  {
    hash ^= ((hash << 5) + (*str++) + (hash >> 2));
  }
 
  return (hash & 0x7FFFFFFF);
}


void Insert(int hash){
  
  //int value = hash%BitSIZE; ([0-3200]范圍的值)
  //int listindex = value / 32; (listindex為數(shù)組下標(biāo))
  //int bitindex = value % 32; (某位)
  
  int value = hash%BitSIZE;
  int listindex = value / 32;
  int bitindex = value % 32;
  int temp = bit[listindex];
  bit[listindex] = bit[listindex] & (1 << bitindex);
  bit[listindex] = bit[listindex] | temp;
}

int Serach(int hash){
  int value = hash%BitSIZE;
  int listindex = value / 32;
  int bitindex = value % 32;
  if (bit[listindex] | (1 << bitindex)){
    return 1;
  }
  return 0;
}



int main () {
  
  char str1[] = "abc123";
  
  //在布隆過濾器中插入某值
  Insert(SDBMHash(str1));
  Insert(RSHash(str1));
  Insert(JSHash(str1));
  
  //在布隆過濾器中判斷某值是否存在
  int i = 0;
  i = i+Serach(SDBMHash(str1));
  i = i+Serach(RSHash(str1));
  i = i+Serach(JSHash(str1));
  if(i == 3){
    printf("字符串:%s存在\n",str1);
  }

  return 0;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis實(shí)現(xiàn)信息已讀未讀狀態(tài)提示

    Redis實(shí)現(xiàn)信息已讀未讀狀態(tài)提示

    這篇文章主要介紹了Redis實(shí)現(xiàn)信息已讀未讀狀態(tài)提示的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • 淺談Redis的幾個(gè)過期策略

    淺談Redis的幾個(gè)過期策略

    在使用redis時(shí),一般會(huì)設(shè)置一個(gè)過期時(shí)間,當(dāng)然也有不設(shè)置過期時(shí)間的,也就是永久不過期。當(dāng)設(shè)置了過期時(shí)間,redis是如何判斷是否過期,以及根據(jù)什么策略來進(jìn)行刪除的。
    2021-05-05
  • Redis?搭建主從集群的操作指南

    Redis?搭建主從集群的操作指南

    單節(jié)點(diǎn)的?Redis?并發(fā)能力有限,要進(jìn)一步提高?Redis?的并發(fā)能力,就需要搭建主從集群,實(shí)現(xiàn)讀寫分離,這篇文章主要給大家介紹了Redis搭建主從集群的操作指南,需要的朋友可以參考下
    2023-08-08
  • 詳解Redis Stream做消息隊(duì)列

    詳解Redis Stream做消息隊(duì)列

    這篇文章主要介紹了詳解Redis Stream做消息隊(duì)列,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Redis數(shù)據(jù)結(jié)構(gòu)SortedSet的底層原理解析

    Redis數(shù)據(jù)結(jié)構(gòu)SortedSet的底層原理解析

    這篇文章主要介紹了Redis數(shù)據(jù)結(jié)構(gòu)SortedSet的底層原理解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • redis部署及各種數(shù)據(jù)類型使用命令詳解

    redis部署及各種數(shù)據(jù)類型使用命令詳解

    這篇文章主要介紹了redis部署及各種數(shù)據(jù)類型使用命令,編譯安裝redis及部署過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Linux下Redis安裝教程詳解

    Linux下Redis安裝教程詳解

    這篇文章主要為大家詳細(xì)介紹了Linux下Redis安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Redis Sentinel服務(wù)配置流程(詳解)

    Redis Sentinel服務(wù)配置流程(詳解)

    下面小編就為大家?guī)硪黄猂edis Sentinel服務(wù)配置流程(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 解決Redis連接無法正常釋放的問題

    解決Redis連接無法正常釋放的問題

    這篇文章主要介紹了解決Redis連接無法正常釋放的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Redis分布式限流組件設(shè)計(jì)與使用實(shí)例

    Redis分布式限流組件設(shè)計(jì)與使用實(shí)例

    本文主要講解基于 自定義注解+Aop+反射+Redis+Lua表達(dá)式 實(shí)現(xiàn)的限流設(shè)計(jì)方案。實(shí)現(xiàn)的限流設(shè)計(jì)與實(shí)際使用。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論