Algorithm 将双对数组分组的最快方法是什么
输入为200 K双精度对,即钥匙对。它们没有范围,即键可以是任何数字 现在的任务是将这些大数据分为以下几类:Algorithm 将双对数组分组的最快方法是什么,algorithm,Algorithm,输入为200 K双精度对,即钥匙对。它们没有范围,即键可以是任何数字 现在的任务是将这些大数据分为以下几类: key1 => (value1, value2, value3) key2 => (value1, value2, value3) ... ... 在比较键的相等性(双精度)时,可以考虑ε(如1e-8) 我已经开发了一个O(n^2)解决方案,但它对于200K双打来说太慢了。想知道有什么改进吗?比如O(nlogn)就好了 再比如, Input: <0.1, 0.3&g
key1 => (value1, value2, value3)
key2 => (value1, value2, value3)
...
...
在比较键的相等性(双精度)时,可以考虑ε(如1e-8)
我已经开发了一个O(n^2)解决方案,但它对于200K双打来说太慢了。想知道有什么改进吗?比如O(nlogn)就好了
再比如,
Input: <0.1, 0.3>, <0.1, 0.4>, <0.2, 0.5>, <0.2, 0.6>, <0.3, 0.7>
Output
0.1 => (0.3, 0.4)
0.2 => (0.5, 0.6)
0.3 => (0.7)
输入:,
输出
0.1 => (0.3, 0.4)
0.2 => (0.5, 0.6)
0.3 => (0.7)
为什么不排序?根据第一个值排序,您就(几乎)完成了。它是O(nlogn)。以避免分组键依赖于其他分组键的问题-将键视为
(1.0,1.0+ε,1.0+2ε,1.0+3ε)
与键一致,如
(1.0,1.0+2个ε,1.0+4个ε,…)
最合乎逻辑的选择似乎是使用HashSet并通过将密钥的实际双倍值量化为大小为EPSILON的bucket来创建一个hash密钥
根据您对EPSILON的要求,您可以采用下面的讨论将您的预期输入范围量化为长输入范围:
< /P>你如何处理你的n个值都在考虑值中的其他值的ε,例如(1,1 +ε,1 +2xEpSelon,1 +3xEpsion)?考虑键是相同的。所以你可以有1000000个数字遵循这个模式,它们都有相同的密钥吗?但是如果你有(1.0,1.0+2xEPSILON,1.0+4xEPSILON,…)它们会有不同的键吗?对我来说没有意义。没关系,输入不会有太多的接近键。谢谢。。我已经用哈希表将我的算法改为O(n),效果很好。。。闪电快!