簡體   English   中英

具有單個哈希函數的LogLog算法如何工作

[英]How LogLog algorithm with single hash function works

我已經找到了LogLog算法基本思想的幾十種解釋,但它們都沒有關於散列函數結果分裂如何工作的細節 我的意思是使用單個哈希函數並不精確,而使用很多函數太貴了。 他們如何用單個哈希函數克服這個問題?

這個答案是我找到的最好的解釋,但對我來說仍然沒有意義:

他們使用了一個哈希,但將其分為兩部分。 一個被稱為桶(桶的總數是2 ^ x)而另一個 - 基本上與我們的哈希相同。 我很難得到正在發生的事情,所以我將舉一個例子。 假設你有兩個元素,你的哈希函數給出0到2 ^ 10的值,產生2個值:344和387.你決定有16個桶。 所以你有了:

 0101 011000 bucket 5 will store 1 0110 000011 bucket 6 will store 4 

你能解釋上面的例子嗎? 你應該有16個桶,因為你有4個長度的標題,對嗎? 那你怎么能有16個桶只有兩個哈希? 我們只估計水桶,對吧? 所以第一個桶的大小為1,第二個桶的大小為4,對吧? 如何合並結果?

散列函數拆分:我們的目標是使用許多超級日志結構(例如,假設16個hyperloglog結構,每個使用64位散列函數)而不是一個,以減少估計錯誤。 直觀的方法可能是處理每個這些hyperloglog結構中的每個輸入。 但是,在這種情況下,我們需要確保超級日志彼此獨立,這意味着我們需要一組16個散列函數,它們彼此獨立 - 這很難找到!

所以我們使用另一種方法。 我們將使用16個獨立的hyperloglog結構,而不是使用一系列64位散列函數,每個結構僅使用60位散列函數。 我們怎么做? 很簡單,我們采用64位散列函數,只忽略前4位,產生60位散列函數。 我們如何處理前4位? 我們使用它們來選擇16個“桶”中的一個(每個“桶”只是一個超級日志結構。注意2 ^ 4位= 16個桶)。 現在,每個輸入都分配給16個桶中的一個,其中60位散列函數用於計算超級日志值。 所以我們有16個hyperloglog結構,每個結構都使用60位哈希函數。 假設我們選擇了一個合適的散列函數(意味着前4位是均勻分布的,並且它們與剩余的60位不相關),我們現在有16個獨立的hyperloglog結構。 我們采用其16個估計值的調和平均值來獲得基數較低的容易出錯的估計值。

希望能搞清楚!

原HyperLogLog紙由提到OronNavon是相當的理論。 如果您正在尋找基數估算器的解釋而無需復雜的分析,您可以查看我目前正在處理的論文: http//oertl.github.io/hyperloglog-sketch-estimation-paper 它還提出了原始估計的概括,不需要對小或大基數進行任何特殊處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM