java重复数字_java – 大量数字中最常重复的数字

编辑#2:

好吧,我搞砸了自己的第一条规则 – 永远不要过早优化.最坏的情况可能是使用范围广泛的股票HashMap – 所以我就是这么做的.它仍然在一秒钟内运行,所以忘记这里的其他一切,就这样做.

在担心棘手的实现之前,我会另外注意自己总是测试速度.

(以下是较旧的过时帖子,如果有人有超过一百万的点数,那么它仍然有效)

HashSet可以工作,但是如果你的整数有一个合理的范围(比如1-1000),那么创建一个1000个整数的数组会更有效,并且对于你的每一百万个整数,增加数组的那个元素. (与HashMap几乎相同的想法,但是优化Hash必须允许的一些未知数应该使它快几倍).

您还可以创建一棵树.树中的每个节点都包含(value,count),树将按值组织(左侧较低值,右侧较高).遍历到您的节点,如果它不存在 – 插入它 – 如果它存在,那么只需增加计数.

值的范围和分布将决定这两个(或常规哈希)中的哪一个会表现得更好.我认为常规哈希不会有很多“获胜”的情况(它必须是一个宽范围和“分组”的数据,即使这样,树也可能获胜.

由于这非常简单 – 我建议您针对实际数据集实施多个解决方案和测试速度.

编辑:RE评论

TreeMap可以工作,但仍会添加一层间接(实现自己非常容易和有趣).如果使用stock实现,则必须使用Integers并在每次增加时不断地转换为int.指向Integer的指针是间接的,并且您存储的对象数量至少为2x.这甚至不计算方法调用的任何开销,因为它们应该内联运气.

通常这将是一个优化(邪恶),但是当你开始接近数十万个节点时,你偶尔必须确保效率,因此内置的TreeMap由于内置HashSet的相同原因而效率低下将.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值