【问题标题】:What is the quickest way to group an array of double pairs对一组双对数组进行分组的最快方法是什么
【发布时间】:2014-05-21 06:26:04
【问题描述】:

输入是 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)

【问题讨论】:

  • 您将如何处理您有 N 个值都在 EPSILON 范围内的考虑集中的某个其他值的情况,例如(1.0、1.0 + EPSILON、1.0 + 2xEPSILON、1.0 + 3xEPSILON)?
  • 考虑键是一样的。
  • 所以你可以有 1,000,000 个遵循该模式的数字,并且它们都有相同的键?但是如果你有 (1.0, 1.0 + 2xEPSILON, 1.0 + 4xEPSILON, ...) 他们会有不同的键吗?对我来说没有意义。
  • 没关系,输入不会有太多关闭键

标签: algorithm


【解决方案1】:

为了避免分组键依赖于其他分组键的问题 - 像对待键一样的问题

(1.0, 1.0 + EPSILON, 1.0 + 2xEPSILON, 1.0 + 3xEPSILON)

之类的键一致

(1.0, 1.0 + 2xEPSILON, 1.0 + 4xEPSILON, ...)

最合乎逻辑的选择似乎是使用 HashSet 并通过将键的实际双精度值量化到大小为 EPSILON 的桶中来创建哈希键。

根据您对 EPSILON 的要求,您可以采用下面的讨论将您的预期输入范围量化为类似 long 的内容:

Convert/Quantize Float Range to Integer Range

【讨论】:

  • 谢谢.. 我已经使用哈希表将我的算法更改为 O(n),就像一个魅力......快速点亮!
【解决方案2】:

为什么不排序?根据第一个值排序,您(几乎)完成了。它是 O(nlogn)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2022-01-18
    相关资源
    最近更新 更多