Недавно я изучал разные алгоритмы в свое свободное время, и тот, с которым я сталкивался, который кажется очень интересным, называется алгоритмом HyperLogLog, который оценивает количество уникальных элементов в списке.
Это было особенно интересно для меня, потому что оно вернуло меня в мои дни MySQL, когда я увидел это значение "Cardinality" (которое я всегда предполагал до недавнего времени, что он был рассчитан не оценен).
Итак, я знаю, как написать алгоритм в 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.