【发布时间】: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