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