![]() |
1
2
请详细说明您的数据。
无论如何,我建议以下想法:修改mergesort以计数重复项。 也就是说,你的工作方式不是数字而是成对的(数字,频率)(你可以使用一些聪明的内存高效的表示方式,例如两个数组而不是成对的数组等)。 您可以从[(x1,1),(x2,1),…]开始,然后像往常一样进行合并排序,但是当您合并以相同值开头的两个列表时,您将该值及其出现次数之和放入输出列表中。以你为例:
通过使用一些聪明的技巧对数组进行初始缩减(获得一个值数组:比原始数组小得多的出现对,但每个“值”的“出现”之和等于原始数组中“值”的出现次数),这可能会得到很大的改进。例如,将数组拆分为连续块,其中的值相差不超过256或65536,并使用一个小数组计算每个块中的出现次数。实际上,这个技巧也可以在以后的合并阶段应用。 |
![]() |
2
3
另一个答案表明,哈希通常更具可伸缩性。然而,对于许多可能的分布(以及许多现实生活中的情况,其中子数组恰好经常被排序,这取决于整个数组是如何组合的)。 timsort 通常是“超自然好”(接近O(n)而不是O(n log n))——我听说它可能会成为Java中的标准/默认排序算法,在一些相当合理的未来数据中(这是Python多年来的标准排序算法)。 没有真正好的方法来解决这样的问题,除了在一些案例上做基准测试,这些案例代表了您希望体验的实际工作负载(有一个明显的风险,您可能会选择一个实际碰巧有偏见/不具代表性的样本--这不是如果您试图构建一个库,它将被许多超出您控制范围的外部用户使用,则风险很小)。 |
![]() |
3
1
对于一个如示例中所示的整数数组,最有效的方法是
如果你做不到,我想不出比hashmap更好的选择了。你只需要一个快速的散列算法。如果你想使用你所有的数据,你不可能得到比o(n)更好的性能。是否可以只使用部分数据? (注意,排序和计数比使用基于hashmap的解决方案(o(n))慢得多(o(n*log(n))。) |
![]() |
S. Jacson · 任意两台发电机的速度差(内置功能) 2 年前 |
![]() |
Sadeq Dousti · 相当于“嵌套删除”的执行性能SQL查询 2 年前 |
![]() |
Prince · 复制大型文件需要更多时间 3 年前 |
![]() |
Sagar · 为什么在循环之外声明变量会更快? 3 年前 |
![]() |
seco · 如何在不挂起页面的情况下加载JS 3 年前 |