输入是200 K双打对,即密钥对。它们没有范围,即键可以是任何数字。
现在,任务是将这些大数据分组到以下内容中:
key1 => (value1, value2, value3)
key2 => (value1, value2, value3)
...
...
在比较键(双精度)的相等性时,可以考虑EPSILON(例如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)
为什么不排序?根据第一个值排序,你(差不多)完成了。这是O(nlogn)。
答案 1 :(得分:1)
为了避免出现分组键的问题,取决于其他分组键 - 处理键的问题,如
(1.0,1.0 + EPSILON,1.0 + 2xEPSILON,1.0 + 3xEPSILON)
与
等关键字一致(1.0,1.0 + 2xEPSILON,1.0 + 4xEPSILON,......)
最合乎逻辑的选择似乎是使用HashSet并通过将密钥的实际double值量化为大小的EPSILON来创建哈希密钥。
根据您对EPSILON的要求,您可以采用以下讨论将您的预期输入范围量化为长的: