5

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

问题是如何找到找到最频繁的三元组的最佳方法。

我解决这个问题的方法是:

假设输入类似于 { 1, 2, 3, 4, 1, 2, 3, 4}

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

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

这样我的算法以 n*n 时间复杂度的顺序运行。有没有更好的方法

这个问题。?

4

2 回答 2

4

您可以在O(n * log n)最坏情况下的空间和时间复杂度下做到这一点:只需将所有三元组插入平衡二叉搜索树,然后找到最大值。

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

于 2013-01-03T14:27:02.290 回答
2

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

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

如果您适当地实现hashequals运行,您将能够找到数字顺序是否重要的​​“最受欢迎”三元组,例如1,2,3 != 2,1,31,2,3 == 2,1,3

遍历整个数组后,您必须找到最大值,其键将是您的“最受欢迎”三元组。通过这种方法,您也可以找到 X 最受欢迎的三元组。此外,您只需扫描一次数组并聚合所有三元组(每个三元组无需额外扫描)。

于 2013-01-03T14:50:34.550 回答