我最近在业余时间学习了不同的算法,我遇到的一个看起来很有趣的算法叫做 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
)。
我一直在阅读这篇论文,了解如何在O ( n ) 时间内计算列表中的重复项并使用最少的内存。
它解释说,通过散列和计数位或可以在一定概率内(假设列表均匀分布)估计列表中唯一项目的数量。
我已经阅读了论文,但我似乎无法理解它。谁能给一个更外行的解释?我知道哈希是什么,但我不明白它们是如何在这个 HyperLogLog 算法中使用的。