【问题标题】:Find all combinations of 3 elements from array of n elements从 n 个元素的数组中查找 3 个元素的所有组合
【发布时间】:2016-12-27 23:47:14
【问题描述】:

我正在考虑最快的算法,以从 n 个元素的数组中返回唯一 3 个元素的所有组合。显而易见的一个是 O(n^3) 解决方案,它考虑了所有可能的组合,但这是蛮力的,我打算更快地找到一些东西。在 C++ 中寻找答案

【问题讨论】:

  • 如果你真的需要“所有”组合,不可能比 O(n^3) 更快,因为输出的大小已经是 O(n^3)。
  • 抱歉,我正在考虑独特的解决方案。我要编辑问题
  • 独特的解决方案是什么意思?
  • 这意味着,我正在寻找包含 3 个元素的组合,但没有重复相同的组合。如果组合与其他组合至少有一个元素不同(在我的问题中它是数组元素的索引),我会认为它是唯一的

标签: algorithm combinations


【解决方案1】:

最坏的情况下(数组的所有项目都不同)你有

n ! / ((n - 3)! * 3!) == n * (n - 1) * (n - 2) / 6

要输出的不同项目,因此您可以实现O(n**3)。 如果数组有很多项,但很少有 distinct 项,您可以对其进行预处理: 删除所有的项目,但三个:

[0, 1, 1, 1, 1, 0, 2, 1, 2, 2, 2, 1] -> [0, 0, 1, 1, 1, 2, 2, 2]

如果你有一个很好的数组项的哈希函数,预处理阶段需要O(N)。在 best 情况下(所有项目都相同),前置处理需要O(N) 唯一的答案输出是O(1),所以你有整个O(N) 常规。

对于任意数组,您的复杂性不能超过O(N)(因为您必须扫描整个数组)。最后,数组项的预处理和良好哈希函数的复杂度在

的范围内
 [O(N)..O(N**3)]

如果你幸运的话,这个过程会快得多;如果你有大数据要输出,那么,你已经输出了大集合......

【讨论】:

    【解决方案2】:

    没有办法做到这一点。因为无论你做什么,你都需要获得这 3 个不同的元素。大小为nC3 = n*(n-1)*(n-2)/6。您肯定需要随时进行迭代。所以你将拥有O(n^3) 的最低复杂度。

    【讨论】:

    • 即使(如我的问题中所述)我只寻找独特的排列?所以那套
    • 所以排列 [1 2 3 ] 与 [3 2 1] 相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多