【发布时间】:2011-08-24 20:17:24
【问题描述】:
在哪里可以找到LogLog algorithm 的有效实现?尝试自己实现它,但我的实现草案产生了奇怪的结果。
Here是:
function LogLog(max_error, max_count)
{
function log2(x)
{
return Math.log(x) / Math.LN2;
}
var m = 1.30 / max_error;
var k = Math.ceil(log2(m * m));
m = Math.pow(2, k);
var k_comp = 32 - k;
var l = log2(log2(max_count / m));
if (isNaN(l)) l = 1; else l = Math.ceil(l);
var l_mask = ((1 << l) - 1) >>> 0;
var M = [];
for (var i = 0; i < m; ++i) M[i] = 0;
function count(hash)
{
if (hash !== undefined)
{
var j = hash >>> k_comp;
var rank = 0;
for (var i = 0; i < k_comp; ++i)
{
if ((hash >>> i) & 1)
{
rank = i + 1;
break;
}
}
M[j] = Math.max(M[j], rank & l_mask);
}
else
{
var c = 0;
for (var i = 0; i < m; ++i) c += M[i];
return 0.79402 * m * Math.pow(2, c / m);
}
}
return {count: count};
}
function fnv1a(text)
{
var hash = 2166136261;
for (var i = 0; i < text.length; ++i)
{
hash ^= text.charCodeAt(i);
hash += (hash << 1) + (hash << 4) + (hash << 7) +
(hash << 8) + (hash << 24);
}
return hash >>> 0;
}
var words = ['aardvark', 'abyssinian', ... ,'zoology']; // about 2 300 words
var log_log = LogLog(0.01, 100000);
for (var i = 0; i < words.length; ++i) log_log.count(fnv1a(words[i]));
alert(log_log.count());
由于未知原因实现对max_error参数非常敏感,它是决定结果大小的主要因素。我敢肯定,有一些愚蠢的错误:)
更新:这个问题在newer version的算法中得到解决。我稍后会发布它的实现。
【问题讨论】:
-
FWIW - 我认为给论文作者发电子邮件会更好。
-
@spinning_plate,其中一位作者大约一个月前去世,另一位的电子邮件地址无效。
-
如果您发布您迄今为止尝试过的内容并解释您的结果,将会有所帮助。
-
您可能更喜欢实现 HyperLogLog,这是同一作者的新算法。您可以在algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf 找到该论文
-
@Carl Staelin,谢谢!本文中提到的“小范围校正”可以解决问题。
标签: javascript algorithm counting loglog hyperloglog