明天中期学习,这些时间的复杂性是我所挣扎的。我将讨论本书中的简单示例和本示例
Exchange排序
void exchangesort (int n, keytype S[])
{
index i, j;
for(i=1; i<=n-1; i++)
for(j=i+1; j<=n; j++)
if(S[j] < S[i])
exchange S[i] and S[j];
}
对于此Exchange排序的“Every-Case Time Complexity”,我理解我们几乎分析j
for循环的部分,因为它具有基本操作(交换)。因此,如果您列出通过总数,则由以下内容给出:
T(n) = (n-1) + (n-2) + (n-3) + ... + 1 = (n-1)n/2
现在我的问题是...... 1来自哪里?我以为是n-1 + n-2 +... + n
。
此外,我真正不明白的是如何提出(n-1)n/2
这显然是我在期中得出的结论,通过观察,(n-1)n/2
并不直观......我知道如何提出T(n) = (n-1) + (n-2)
等等,我认为...
有人可以用外行的方式向我解释这个问题,所以我可以在明天的中期提出这样的答案吗?
答案 0 :(得分:4)
在内部循环中,j
从i+1
到n
,即通过n-i
值。总而言之,有
sum_{i = 1 to n-1} (n-i)
步骤,(n-1) + (n-2) + ... + (n - (n-1)) = (n-1) + (n-2) + ... . 1
。
现在,对于第一个k
正整数的总和,有一个封闭的公式,它是
k*(k+1)/2
此处k = n-1
。
要计算出第一个k
正整数之和的公式,有几种不错的方法,如robert king's answer中所述。据称,高斯在他五岁的时候以第一种方式解决这个问题,老师让学生们计算1到100之间整数的总和,希望能有几分钟安静。最好是看看是否安排如下:
1 + 2 + ... + (n-1) + n
n + (n-1) + ... + 2 + 1
----------------------------------
(n+1) + (n+1) + ... + (n+1) + (n+1) = n*(n+1)
答案 1 :(得分:1)
解决问题的一种方法是:
和= 1 + 2 + 3 + 4 + ... + N
2 * sum = 1 + 2 + 3 + 4 + ... + n + 1 + 2 + 3 + 4 + ... + n = 1+(n)+ 2+(n-1)+ 3 +(n-2).. +(n)+1
2 * sum = 1 + n + 1 + n + 1 + n ...
2 * sum = n(1 + n)
和= N *(N + 1)/ 2
但更简单的方法是想象一个正方形或网格矩阵。
当我向下到每个新行时,j越过并且额外的列到矩阵的对角线(因为i <= j ..我们知道j不能越过对角线)。 这意味着所有操作都是矩阵对角线一侧的(i,j)组合。 因此,操作次数是整个矩阵面积的一半。如果矩阵是一个n * n矩阵,那么我们有大约n * n / 2的面积(但是因为我们不能将对角线计算两倍,实际上是n *(n-1)/ 2
答案 2 :(得分:0)
好的,请这样想:
When i = 1, inner loop runs (n - 1) times [j = 2 to n]
When i = 2, inner loop runs (n - 2) times [j = 3 to n]
When i = 3, inner loop runs (n - 3) times [j = 4 to n]
....
When i = k, inner loop runs (n - k) times [j = k + 1 to n]
...
When i = n - 1, inner loop runs (n - (n - 1)) = 1 time [j = n to n]
现在总结一下:
(n - 1) + (n - 2) + (n - 3) + ... + 1 = n(n - 1) / 2
在最糟糕的情况下,exchange
将完成n(n - 1) / 2
次。
答案 3 :(得分:0)
系列从(n-1)到(1)[(n-1),(n-2)......(n-(n-1))] 检查系列here的总和,以了解它是如何派生的。它很容易理解。