查找n个元素

时间:2016-12-27 14:01:56

标签: algorithm combinations

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

2 个答案:

答案 0 :(得分:1)

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

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

要输出的不同项目,因此O(n**3)是您可以实现的。 如果数组有很多项,但很少不同,那么你可以预处理它: 删除所有项目的货币,但有三个:

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

如果你对数组的项有一个很好的哈希函数,那么预处理阶段需要O(N)。在最佳案例中(所有项目都相同),预处理需要O(N) 并且唯一的答案输出是O(1),因此您可以获得整个O(N) 常规。

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

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

如果你很幸运,这个过程会更快;如果您要输出大量数据,那么您可以输出大型集合......

答案 1 :(得分:0)

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