我最近在业余时间一直在学习不同的算法,我遇到的一个看起来很有趣的算法叫做HyperLogLog算法-该算法估计列表中有多少个唯一项。
这对我特别有趣,因为当我看到“基数”值(直到最近,我一直认为直到最近才算出它不是估计值)时,它才使我回到MySQL时代。
因此,我知道如何在O(n)中编写一种算法,该算法将计算数组中有多少个唯一项。我是用JavaScript编写的:
function countUniqueAlgo1(arr) {
var Table = {};
var numUnique = 0;
var numDataPoints = arr.length;
for (var j = 0; j < numDataPoints; j++) {
var val = arr[j];
if (Table[val] != null) {
continue;
}
Table[val] = 1;
numUnique++;
}
return numUnique;
}
但是问题是我的算法虽然为O(n),却占用了大量内存(将值存储在中Table
)。
我一直在阅读本文有关如何在重复计数在列表Ø(ñ)的时间和使用的内存。
它解释说,通过对位进行散列和计数或可以在一定概率(假设列表均匀分布)中估计的某种事物中列表中唯一项的数量。
我读过这篇论文,但似乎看不懂。有人可以给其他人解释吗?我知道什么是哈希,但是我不明白在此HyperLogLog算法中如何使用它们。