Java 无穷流中保持n个数的最大频率
给定无止境的数字流(BigInteger),如何检测和存储具有前N个外观(频率)的数字 内存有限(无法存储每个数字的计数器) 编辑:Java 无穷流中保持n个数的最大频率,java,algorithm,Java,Algorithm,给定无止境的数字流(BigInteger),如何检测和存储具有前N个外观(频率)的数字 内存有限(无法存储每个数字的计数器) 编辑: 频率值不能超过long的大小在获得所有数据(或大部分数据)之前,无法确定前N个外观 到目前为止,您可以通过计算它们出现的频率并按计数对它们进行排序来确定N的外观。如果你不能储存超过许多的东西,这可能是一个问题。在这种情况下,你必须决定要做出什么样的妥协来节省空间 我认为长不够大。你在统计什么样的数据 一个简单的例子来说明你所面临的问题 假设你源源不断的帐户ID都
频率值不能超过
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是的,同时对所有访问都是如此。否则,可以很容易地构造反例。例如,定期出现但很少出现的元素,以及仅出现一次但配置非常密集的一组元素。根据时间线,要么缓慢但稳定,要么