我们有一个N个数字的数组。所有数字都在1-k之间。
问题是如何找到寻找最常见三联体的最佳方法。
我解决问题的方法是:
说输入是否像{1,2,3,4,1,2,3,4}
首先从数组中的第二个元素开始搜索三元组(1,2,3)的计数,直到数组结束。现在我们将计数为1。 现在从{2,3,4)开始并搜索数组。
对于每个三元组,我们扫描数组并找到计数。像这样我们运行数组n-1次。
这样我的算法以n * n时间复杂度的顺序运行。
还有更好的方法吗?这个问题。?
答案 0 :(得分:4)
您可以在O(n * log n)
最坏情况下的空间和时间复杂度中执行此操作:只需将所有三元组插入到平衡二进制搜索树中,然后找到最大值。
或者,您可以使用哈希表来获得O(n)
预期时间(如果您选择一个好的哈希函数,通常比实际中的搜索树方法更快)。
答案 1 :(得分:2)
是否存在任何内存边界,即它是否在具有内存限制的设备上运行?
如果没有,也许这可能是一个很好的解决方案:迭代数组和每个tripple构建和表示对象(或结构,如果在c#中实现),它作为键进入map,而tripple计数器作为值。
如果您恰当地实施hash
和equals
功能,您将能够找到数字排序重要的“最受欢迎”的三重奏,例如: 1,2,3 != 2,1,3
或1,2,3 == 2,1,3
在迭代整个数组后,你必须找到最大的值,它的关键是你的“最受欢迎的”三重奏。通过这种方法,您也可以找到X最受欢迎的三胞胎。此外,您只扫描数组一次并聚合所有trippels(不会对每个tripple进行额外扫描)。