【问题标题】:What would be the worst case time complexity for this algorithm?该算法的最坏情况时间复杂度是多少?
【发布时间】:2014-02-02 20:51:21
【问题描述】:

算法如下:

boolean findTripleA(int[] anArray) { 
    if (anArray.length <= 2) { 
        return false; 
    } 

    for (int i=0; i < anArray.length; i++) { 
        // check if anArray[i] occurs at least three times 
        // by counting how often it occurs in anArray 

        int count = 0; 

        for (int j = 0; j < anArray.length; j++) { 
            if (anArray[i] == anArray[j]) { 
                count++; 
            } 
        } 

        if (count >= 3) { 
            return true; 
        } 
    } 

    return false;
}

该算法旨在确定一个数组是否包含至少一个数字 在数组中出现 3 次或更多次。我的工作是找出这个数组最坏的情况,以及它的时间复杂度。

我的想法是,最坏的情况是算法的每个条目都出现两次(如果数组有奇数个元素,则额外的条目是唯一的)。在这种情况下,for (int j = 0; j &lt; anArray.length; j++) 中的 if 语句在每次通过数组时总是被违反两次,从而强制执行两次计算,但算法在检查完每个元素之前实际上并没有终止。我在想这会有O(n^2)的时间复杂度。

谁能提供对此的任何见解?因为我一直怀疑自己是不正确的,如果是这样,我想弄清楚正确的答案以及为什么它是正确的。

【问题讨论】:

  • 是的,它是 O(n²)。最坏的情况会发生,例如当您的数据具有唯一值时,除了最后 3 个相同的元素。
  • @Alexandru Barbarosie 我也在考虑最后三个元素是否相同,但是当它到达倒数第二个条目而不是搜索所有条目时,该方法将返回“true”。这是不正确的想法吗?
  • 顺便说一句,您可以在 O(n) 最坏情况下执行此操作,方法是迭代一次,然后对您迄今为止看到的所有数字进行(散列)计数器。
  • @RAF1940 不过仍然会是 O(n^2)(是的,如果一直出现 2 次会稍微更糟)。
  • @RAF1940 O(n²) - O(1) = O(n²)(其中 O(1) 是您最后一次计算的常数时间)

标签: java arrays algorithm big-o time-complexity


【解决方案1】:

最坏的情况是 O(N^2),当你找不到三元组时就会发生这种情况。

【讨论】:

  • 那么if语句被违反多少次是无关紧要的?
  • @RAF1940 是的,还在使用一定次数。
  • 我不知道你怎么能违反 if 语句......无论如何,你在外部循环中遍历整个数组,然后在内部循环中再次运行,除非你达到计数> =3。
【解决方案2】:

如果我们谈论的是纯运行时间,那么当 if 语句条件为真时就会发挥作用(然后您还必须担心分支预测之类的事情),但是

if (anArray[i] == anArray[j]) { 
    count++; 
}

无论 if 语句条件是否为真,都需要 O(1) 时间。因此,对于运行时间复杂度,整个函数将花费 O(n2)。这将发生在任何情况下,要么没有 3 次出现,要么第一次出现 3 次或更多次的元素接近尾声(“接近尾声”实际上可能不是那么接近,但让我们把它留给另一个天)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多