【问题标题】:Time complexity analysis in finding index of smallest element in an array-worst,average and best case查找数组中最小元素索引的时间复杂度分析——最坏情况、平均情况和最佳情况
【发布时间】:2017-06-30 10:35:21
【问题描述】:
int j = 0;
for(int i = 0; i < n; ++i) {
    while(j < n && arr[i] < arr[j]) {
        j++;
    }
}

这是查找数组中最小元素(第一次出现)的索引的代码。我说最坏的情况是 O(n2) 最好的情况是 O(n)。

问题 1: 在最坏的情况下,我的内部 while 循环并不总是运行 n 次,在大多数情况下,它会相对于外部 for 循环运行 1 或 2 次,所以我假设内循环运行 (n-c) 次,其中 c 是某个常数,外循环运行 n 次。我是否正确地认为复杂度会是 n*(n-c),即 O(n2)?

在最好的情况下,最小元素位于第一个索引处,我的内部循环不会运行任何时间,因此时间复杂度为 O(n)。

问题 2:我如何得出平均情况?

【问题讨论】:

  • 我不明白您是如何找到具有更多 O(n) 的算法的。只需在数组上迭代一次并获取较低的元素。
  • 任何搜索算法的最坏情况可能是 O(n)。
  • 正如@Stargateur 建议的那样,您的算法与任何搜索算法一样具有更高的复杂性,不需要内部循环,请尝试消除它。在此链接中回答您的第二个问题,正确解释了平均情况以及如何实现它,简而言之,就是使用基于概率分布或随机数的总体测试算法。 wikipedia-average-case
  • 是的,我们可以在 O(n) 中做到这一点,但是我得到了这段代码来计算时间复杂度。帮我找到这个......!谢谢。

标签: c arrays time-complexity nested-loops


【解决方案1】:

您从j = 0 开始,从不减少jwhile循环的每次迭代将j加一,while循环有条件j &lt; n,所以语句j++最多可以运行n次,即最坏情况O(n) .

【讨论】:

  • 是的,谢谢。 j 在任何时候都不会超过 n。因此,在所有 3 种情况下,时间复杂度都是 O(n)。对吧??
【解决方案2】:

我们可以在寻找大 O 表示法(why?)时简单地忽略常量。

您编写的用于查找数组中最小元素的索引的程序在数组元素按升序排列时进行 n 次迭代,在数组元素按降序排列时进行 2*n 次迭代。但我们可以简单地得出结论,该算法在所有三种情况下都具有总体 O(n) 复杂度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多