找到阵列中最常见的三元组

时间:2013-01-03 14:23:20

标签: arrays algorithm data-structures

我们有一个N个数字的数组。所有数字都在1-k之间。

问题是如何找到寻找最常见三联体的最佳方法。

我解决问题的方法是:

说输入是否像{1,2,3,4,1,2,3,4}

首先从数组中的第二个元素开始搜索三元组(1,2,3)的计数,直到数组结束。现在我们将计数为1。 现在从{2,3,4)开始并搜索数组。

对于每个三元组,我们扫描数组并找到计数。像这样我们运行数组n-1次。

这样我的算法以n * n时间复杂度的顺序运行。

还有更好的方法吗?

这个问题。?

2 个答案:

答案 0 :(得分:4)

您可以在O(n * log n)最坏情况下的空间和时间复杂度中执行此操作:只需将所有三元组插入到平衡二进制搜索树中,然后找到最大值。

或者,您可以使用哈希表来获得O(n)预期时间(如果您选择一个好的哈希函数,通常比实际中的搜索树方法更快)。

答案 1 :(得分:2)

是否存在任何内存边界,即它是否在具有内存限制的设备上运行?

如果没有,也许这可能是一个很好的解决方案:迭代数组和每个tripple构建和表示对象(或结构,如果在c#中实现),它作为键进入map,而tripple计数器作为值。

如果您恰当地实施hashequals功能,您将能够找到数字排序重要的“最受欢迎”的三重奏,例如: 1,2,3 != 2,1,31,2,3 == 2,1,3

在迭代整个数组后,你必须找到最大的值,它的关键是你的“最受欢迎的”三重奏。通过这种方法,您也可以找到X最受欢迎的三胞胎。此外,您只扫描数组一次并聚合所有trippels(不会对每个tripple进行额外扫描)。