Algorithm 将双对数组分组的最快方法是什么

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

输入为200 K双精度对,即钥匙对。它们没有范围,即键可以是任何数字

现在的任务是将这些大数据分为以下几类:

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),效果很好。。。闪电快!