最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過實例解析布隆過濾器工作原理及實例

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

布隆過濾器

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

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

布隆過濾器的工作原理

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

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

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

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

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

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

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

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

m的選?。?/p>

k的選?。?/p>

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

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

通過公式計算出來k=14。

計算真實失誤率:

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

c語言實現(xiàn)

#include <stdio.h>

#define Size 100
#define BitSIZE Size * 4 * 8
//c語言中一個整型數(shù)據(jù)類型4個字節(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ù)組下標)
  //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)文章

  • 關(guān)于Redis的讀寫一致問題

    關(guān)于Redis的讀寫一致問題

    在項目使用Redis過程中,當(dāng)數(shù)據(jù)更新時,我們要保證緩存和數(shù)據(jù)庫的一致性,否則會導(dǎo)致很多臟數(shù)據(jù)出現(xiàn),此時我們就要思考如何去進行數(shù)據(jù)更新,本文就給大家講講關(guān)于redis的讀寫一致問題,需要的朋友可以參考下
    2023-08-08
  • 從原理到實踐分析?Redis?分布式鎖的多種實現(xiàn)方案

    從原理到實踐分析?Redis?分布式鎖的多種實現(xiàn)方案

    在分布式系統(tǒng)中,為了保證多個進程或線程之間的數(shù)據(jù)一致性和正確性,需要使用鎖來實現(xiàn)互斥訪問共享資源,然而,使用本地鎖在分布式系統(tǒng)中存在問題,這篇文章主要介紹了從原理到實踐分析?Redis?分布式鎖的多種實現(xiàn)方案,需要的朋友可以參考下
    2024-07-07
  • Redis實現(xiàn)多人多聊天室功能

    Redis實現(xiàn)多人多聊天室功能

    這篇文章主要為大家詳細介紹了Redis實現(xiàn)多人多聊天室功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 使用百度地圖api通過redis實現(xiàn)地標存儲及范圍坐標點查詢功能

    使用百度地圖api通過redis實現(xiàn)地標存儲及范圍坐標點查詢功能

    這篇文章主要介紹了使用百度地圖api通過redis實現(xiàn)地標存儲及范圍坐標點查詢功能,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細,需要的朋友可以參考下
    2021-08-08
  • redis監(jiān)聽key過期事件的詳細步驟

    redis監(jiān)聽key過期事件的詳細步驟

    本文主要介紹了redis監(jiān)聽key過期事件的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 基于redis實現(xiàn)定時任務(wù)的方法詳解

    基于redis實現(xiàn)定時任務(wù)的方法詳解

    這篇文章主要給大家介紹了基于redis實現(xiàn)定時任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 使用Redis實現(xiàn)令牌桶算法原理解析

    使用Redis實現(xiàn)令牌桶算法原理解析

    這篇文章主要介紹了使用Redis實現(xiàn)令牌桶算法,該算法可以應(yīng)對短暫的突發(fā)流量,這對于現(xiàn)實環(huán)境中流量不怎么均勻的情況特別有用,不會頻繁的觸發(fā)限流,對調(diào)用方比較友好,需要的朋友可以參考下
    2021-12-12
  • Redisson實現(xiàn)分布式鎖、鎖續(xù)約的案例

    Redisson實現(xiàn)分布式鎖、鎖續(xù)約的案例

    這篇文章主要介紹了Redisson如何實現(xiàn)分布式鎖、鎖續(xù)約,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • redis簡介_動力節(jié)點Java學(xué)院整理

    redis簡介_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了redis簡介,Redis是一個開源的,先進的 key-value 存儲可用于構(gòu)建高性能,可擴展的 Web 應(yīng)用程序的解決方案,有興趣的可以了解一下
    2017-08-08
  • 如何操作Redis和zookeeper實現(xiàn)分布式鎖

    如何操作Redis和zookeeper實現(xiàn)分布式鎖

    這篇文章主要介紹了如何操作Redis和zookeeper實現(xiàn)分布式鎖的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評論

玉树县| 资中县| 嵊州市| 苍溪县| 浦北县| 鄂尔多斯市| 中宁县| 彭阳县| 全州县| 钦州市| 阳原县| 竹北市| 青海省| 历史| 垫江县| 金溪县| 金堂县| 南宫市| 桂东县| 稷山县| 邵东县| 酉阳| 交城县| 揭阳市| 灵山县| 开远市| 敦化市| 电白县| 台山市| 定结县| 和田市| 武定县| 延边| 黑山县| 兴城市| 文安县| 米林县| 垫江县| 蒙阴县| 霍州市| 开江县|