我正在学习复杂性理论的课程,所以它需要一些我有问题的数学背景。所以当我试图做一些练习时,我陷入了下面的例子
1) for (i = 1; i < n; i++) {
2) SmallPos = i;
3) Smallest = Array[SmallPos];
4) for (j = i+1; j <= n; j++)
5) if (Array[j] < Smallest) {
6) SmallPos = j;
7) Smallest = Array[SmallPos]
}
8) Array[SmallPos] = Array[i];
9) Array[i] = Smallest;
}
因此,总计算时间为:
T(n) = (n) + 4(n-1) + n(n+1)/2 – 1 + 3[n(n-1) / 2]
= n + 4n - 4 + (n^2 + n)/2 – 1 + (3n^2 - 3n) / 2
= 5n - 5 + (4n2 - 2n) / 2
= 5n - 5 + 2n^2 - n
= 2n^2 + 4n - 5
= O(n^2)
以及我对第 4 行分析到n(n+1)/2 – 1和第 5 3[n(n-1) / 2]行的不理解或困惑 。我知道正序列的总和是 =n(first+last)/2,但是当我尝试按照我的理解计算它时,它给了我不同的结果。我计算第 4 行,所以它应该是=n((n-1)+2)/2根据n(first+last)/2,但这里是n(n+1)/2 – 1。和3[n(n-1) / 2]一样......我也不明白
这也是分析中写的内容,如果有人可以向我解释,它会有所帮助,
语句 1 执行 n 次 (n - 1 + 1);语句 2、3、8 和 9(每个表示 O(1) 时间)分别执行 n - 1 次,每次通过外循环时执行一次。在 i = 1 的第一次循环中,语句 4 被执行 n 次;语句 5 执行 n - 1 次,假设最坏的情况是数组的元素按降序排列,语句 6 和 7(每个 O(1) 时间)执行 n - 1 次。
在 i = 2 的第二次通过外部循环时,语句 4 被执行 n - 1 次,语句 5、6 和 7 被执行 n - 2 次,依此类推。因此,语句 4 被执行 (n) + (n -1) +... + 2 次,语句 5、6 和 7 被执行 (n-1) + (n-2) + ... + 2 + 1 次。第一个和等于 n(n+1)/2 - 1,第二个和等于 n(n-1)/2。
因此,总计算时间为:
T(n) = (n) + 4(n-1) + n(n+1)/2 – 1 + 3[n(n-1) / 2]
= n + 4n - 4 + (n^2 + n)/2 – 1 + (3n^2 - 3n) / 2
= 5n - 5 + (4n2 - 2n) / 2
= 5n - 5 + 2n^2 - n
= 2n^2 + 4n - 5
= O(n^2)