【问题标题】:complexity theory-sorting algorithm复杂性理论排序算法
【发布时间】:2012-10-06 20:21:59
【问题描述】:

我正在学习复杂性理论课程,因此需要一些数学背景,但我有问题。 所以当我尝试做一些练习时,我陷入了下面的例子中

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(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)

这是包含此示例的文件的链接: http://www.google.com.eg/url?sa=t&rct=j&q=Consider+the+sorting+algorithm+shown+below.++Find+the+number+of+instructions+executed+&source=web&cd=1&cad=rja&ved=0CB8QFjAA&url=http%3A%2F%2Fgcu.googlecode.com%2Ffiles%2FAnalysis%2520of%2520Algorithms%2520I.doc&ei=3H5wUNiOINDLswaO3ICYBQ&usg=AFQjCNEBqgrtQldfp6eqdfSY_EFKOe76yg

【问题讨论】:

  • T(n) = O(n^2) 在语法上不正确,应该是:T(n) is in O(n^2),因为 O(n^2) 是一个 set 函数。

标签: algorithm complexity-theory time-complexity calculus


【解决方案1】:

第 4 行:正如分析所说,它被执行了n+(n-1)+...+2 次。这是(n-1) 术语的总和。在您使用的公式中,n(first+last)/2n 代表词条数。如果将公式应用于n-1 术语的序列,那么它应该是(n-1)((n)+(2))/2=(n²+n-2)/2=n(n+1)/2-1

第 5 行:可以使用相同的公式。正如分析所说,你必须计算(n-1)+...+1。这是n-1 项的总和,第一个和最后一个是n-11。总和由(n-1)(n-1+1)/2 给出。因子 3 来自 3 行 (5,6,7),每行都在完成 (n-1)(n)/2

【讨论】:

  • 现在我了解第 4 行它是如何计算的,但我在第 5 行质疑为什么 (n-1)+...+1 的 n-1 项总和。为什么不是 n+(n-1)+...+2,因为这是在从 2 到 n 开始的 for 循环中。
  • 在第 4 行我也认为遗漏了一些东西,必须进行一项额外的检查,这将终止循环。它在哪里。
  • 第 5 行:在您的第一个内部循环中,j 将假定 2 到 n 的所有值。对于该循环中的每个值,您将执行第 5 行 1 次。在公式(n-1)+...+1 中,您实际上是通过计算在每个循环中执行的次数来计算第 5 行执行的次数(总共):第一个循环中的 n-1 次(对于 i=1),n -2 次 i=2... 如果您执行 n+n-1+...+2,则您正在对所有 j 值求和,而您想要对第 5 行的执行次数求和。
  • 关于 for 循环评估,确实是真的,每次执行循环时都会检查布尔表达式(当它产生 true 时)+ 1 次(当它产生 false 时)。然而,在分析复杂性时,每条语句都被认为是相同的(一条简单的增量线将总计数加 1,与求幂或什至更复杂的事情相同),而它们显然不相同。这就是为什么,通常,我们只对 O(n)-nature 感兴趣,而不关心那 1 个额外的检查(因为分解每个语句会导致我们走得太远)
  • 你的意思是,例如,如果我有一个正数序列 1,2,3,4,5 :对于 i=1->j=2,3,4,5,对于i=2->j=3,4,5,对于 i=3->j=4,5,对于 i=4-> j=5,所以第 5 行将被执行 4+3+2+1= 10 次,这与序列 (n-1)+...+1 匹配,如果我考虑序列 n+n-1+...+2 ,则相反,它将是 2+3+ 的总和4+5=14 次,这是不正确的......你的意思是这样。
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 2021-08-22
  • 1970-01-01
  • 2022-01-13
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多