Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无穷流中保持n个数的最大频率_Java_Algorithm - Fatal编程技术网

Java 无穷流中保持n个数的最大频率

Java 无穷流中保持n个数的最大频率,java,algorithm,Java,Algorithm,给定无止境的数字流(BigInteger),如何检测和存储具有前N个外观(频率)的数字 内存有限(无法存储每个数字的计数器) 编辑: 频率值不能超过long的大小在获得所有数据(或大部分数据)之前,无法确定前N个外观 到目前为止,您可以通过计算它们出现的频率并按计数对它们进行排序来确定N的外观。如果你不能储存超过许多的东西,这可能是一个问题。在这种情况下,你必须决定要做出什么样的妥协来节省空间 我认为长不够大。你在统计什么样的数据 一个简单的例子来说明你所面临的问题 假设你源源不断的帐户ID都

给定无止境的数字流(BigInteger),如何检测和存储具有前N个外观(频率)的数字

内存有限(无法存储每个数字的计数器)

编辑:


频率值不能超过
long的大小

在获得所有数据(或大部分数据)之前,无法确定前N个外观

到目前为止,您可以通过计算它们出现的频率并按计数对它们进行排序来确定N的外观。如果你不能储存超过许多的东西,这可能是一个问题。在这种情况下,你必须决定要做出什么样的妥协来节省空间

我认为
不够大。你在统计什么样的数据


一个简单的例子来说明你所面临的问题

假设你源源不断的帐户ID都是不同的。这意味着记录前N名的唯一方法是将它们全部记录下来。没有一些捷径,就没有其他可能的解决办法


注意:很可能你真正想要的是一个衰减的平均值,因此,如果一个用户已经被看到一段时间,你想减轻他们的体重。您不希望顶级用户不再处于活动状态。

在您拥有所有数据(或大部分数据)之前,无法确定top N外观

到目前为止,您可以通过计算它们出现的频率并按计数对它们进行排序来确定N的外观。如果你不能储存超过许多的东西,这可能是一个问题。在这种情况下,你必须决定要做出什么样的妥协来节省空间

我认为
不够大。你在统计什么样的数据


一个简单的例子来说明你所面临的问题

假设你源源不断的帐户ID都是不同的。这意味着记录前N名的唯一方法是将它们全部记录下来。没有一些捷径,就没有其他可能的解决办法


注意:很可能你真正想要的是一个衰减的平均值,因此,如果一个用户已经被看到一段时间,你想减轻他们的体重。您不希望顶级用户不再处于活动状态。

如果流是无止境的,一些较低频率的用户可能会变得更频繁。这意味着您必须更新所有号码的频率

另一方面,由于
大整数
没有界限,因此您有无限的存储需求:对于每个数字
n
,您必须至少存储一些信息(比如说一点)。如果内存是有限的
f
,则存在另一个整数
m
,使得
m*n>f

如果没有一些额外的约束,这个问题是无法解决的

编辑
如您所示,您希望跟踪访客数量。仅仅计算过去一年或一个月的数字不是更容易吗?你只要有一本字典(访客、访客)就行了。至于BigInteger,您计划拥有2^63-1个以上的用户吗

如果流是无止境的,一些较低频率的数字可能会变得更频繁。这意味着您必须更新所有号码的频率

另一方面,由于
大整数
没有界限,因此您有无限的存储需求:对于每个数字
n
,您必须至少存储一些信息(比如说一点)。如果内存是有限的
f
,则存在另一个整数
m
,使得
m*n>f

如果没有一些额外的约束,这个问题是无法解决的

编辑

如您所示,您希望跟踪访客数量。仅仅计算过去一年或一个月的数字不是更容易吗?你只要有一本字典(访客、访客)就行了。至于BigInteger,您计划拥有2^63-1个以上的用户吗

如果您可以假设分布是平稳的,并且您接受一个近似结果,那么您可以基于流中的有限个数字样本来估计结果。

如果您可以假设分布是平稳的,并且您接受一个近似结果,那么您可以基于流中的有限个数字样本来估计结果流。

@moooeeep,流是无止境的,内存是有限的(见问题),所以答案是“否”可能会有所帮助。这篇文章似乎有关联,可能是重复的:内存限制是什么?如果它是biginteger的最大值,则没有问题,可以使用naive算法。或者限制为N?@dfens没有最大值的
biginger
——它是任意精确的。@moooeeep,流是无限的,内存是有限的(见问题),所以答案是“否”可能会有所帮助。这篇文章似乎是相关的,可能是重复的:内存限制是什么?如果它是biginteger的最大值,则没有问题,可以使用naive算法。或者它被限制为N?@dfens没有最大值
biginger
——它是任意精确的。我正在计算实体(用户帐户)使用类型为
biginger
的ID,并希望保留N个最频繁访问用户的记录。我很惊讶您拥有超过18万亿个帐户ID,但您仍然必须将它们全部计算在内,因为您永远不知道最频繁的帐户何时启动。您可以做的是分批保留最频繁的数据,并保留前2*N以适合前N个数据,但只有您知道在采样数据时可以采取哪些捷径。@aviad您对用户帐户的数量有限制吗?为什么要使用
大整数
?@PeterLawrey我更惊讶的是,他想知道的是,对于所有的访问,而不是最近一年/一个月的访问,这将使任务变得更容易。@aviad是的,同时对所有访问都是如此。否则,可以很容易地构造反例。例如,定期出现但很少出现的元素,以及仅出现一次但配置非常密集的一组元素。根据时间线,要么缓慢但稳定,要么