【问题标题】:Calculating Time Complexity.. Need help coming up with the end result计算时间复杂度..需要帮助得出最终结果
【发布时间】:2012-02-08 19:51:40
【问题描述】:

为明天的期中考试而学习,这些时间复杂性是我难以解决的问题。我将复习书中的简单示例以及此示例

交换排序

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 排序的“每个案例时间复杂性”,我理解我们非常分析 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) 等,我想......

谁能用通俗的话给我解释一下,这样我明天的期中考试就可以想出这样的答案了吗?

【问题讨论】:

  • 细节记不太清楚了。但请注意,在 最坏 的情况下,每个循环都会执行 n 次循环。所以,你有 2 个 nested 循环。这就是为什么你有(n)(n)。希望其他stackoverflowers能给你准确的答案。

标签: asymptotic-complexity


【解决方案1】:

在内循环中,ji+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 前 k 个整数的总和解释得很好here,但你需要记住它...
  • 啊,谢谢,现在我明白 1 的来源了。所以我想如果我理解正确,k*(k+1)/2 只是一个我应该“只知道”的常规算术公式......
【解决方案2】:

一种解决方法是:

总和=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

但更简单的方法是想象一个正方形或网格矩阵。

当 i 向下到每个新行时, j 越过矩阵的对角线和额外的列(因为 i

【讨论】:

  • 另外,我不确定你是否需要自己想出这个公式.. 这是一个相当标准的公式。总和 1+2+3+..+n 出现在许多数学领域。大多数人只是使用它而没有每次都证明它
  • 谢谢罗伯特,正方形/矩阵的解释让我很容易想象
【解决方案3】:

好的,这样想:

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 次。

【讨论】:

    【解决方案4】:

    序列从 (n-1) 到 (1) [(n-1), (n-2) ... (n-(n-1))] 检查系列的总和here 以了解它是如何得出的。它很容易理解。

    【讨论】:

    • 感谢链接,这让我意识到这只是一个我应该知道的公式
    • 但请注意仅适用于算术级数的原因。在您的情况下,这将是最适用的,但请注意。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多