【问题标题】:Calculating big O swaps, calculations, and comparisons计算大 O 互换、计算和比较
【发布时间】:2023-11-19 06:33:01
【问题描述】:

看下面的代码:

Algorithm sort

Declare A(1 to n)

n = length(A)

for i = 1 to n
    for j = 1 to n-1 inclusive do
       if A[i-1] > A[i] then
          swap( A[i-1], A[i] )
       end if
  next j
next i

我会说有:

  • 2 个循环,均为 n,n*n = n^2(n-1 截断为 n)
  • 1比较,在j循环中,会执行n^2次
  • 将执行 n^2 次的交换
  • 循环也有2n个加法,执行n^2次,所以2n^2

评分方案中给出的答案:

算法评估

比较

唯一的比较出现在 j 循环中。 由于此循环将迭代总共 n^2 次,它将执行 正好 n^2

数据交换

  • 可能在 j 循环中执行了交换操作。
  • Swap( A[i-1], A[i] ) 每一个都会发生 n^2 次。
  • 因此在 j 循环中执行了 2n^2 次操作
  • i 循环有一个增加 i 的加法运算,这发生在 n 次
  • 将这些加起来就是加法运算的次数,即 2n^2 + n
  • 当 n 变得非常大时,n^2 将占主导地位,因此它是 O(n^2)

注意:计算可能包括赋值操作,但这些不会影响总时间,因此请忽略

标记概述:

  • 1 个标识 i 循环的标记将执行 n 次。
  • 标识j循环的1个标记将执行2n^2次这不是意味着n*n = n^2吗?对于 i 和 j
  • 1 分表示正确的计算次数 2n^2 + n 为什么不这样 +2n?
  • 1 标记,用于确定顺序将由 n^2 支配为 n 得到非常大的算法 O(n^2)

编辑:从标记方案可以看出,我预计数:

  • 循环数,但 n-1 可以截断为 n
  • 比较,例如if 语句
  • 数据交换(计为一个语句,即 arr[i] = arr[i+1]、temp = arr[i] 等视为一个交换)
  • 计算
  • 空格 - 仅 n 用于数组等。

谁能解释一下这些答案是如何得出的?

谢谢!

【问题讨论】:

  • 我不确定你从哪里得到 n^3,这是一个冒泡排序,运行时间为 O(n^2)。您必须修复格式才能获得答案,不清楚您在问什么。如果您想要渐近复杂度,它是 +n 还是 +2n 并不重要。如果您正在寻找确切的复杂性,则必须选择您定义为基本操作的内容(在这种情况下可能是交换)
  • n^3 在标记方案中给出。我也知道您不需要 +n 等整体,但它们在标记方案中。第一部分是我的看法,第二部分是标记方案。
  • 我很确定 n^3 是错的,你得问问你的老师/教授。 (顺便说一句,您可以使用 # 在 markdown 中制作标题,这可能会帮助您更好地组织您的问题)
  • 谢谢!希望现在更清楚一点
  • n^3 看起来像一个简单的输入错误,因为它与文本的其余部分不一致。你的老师似乎也忘记了 j 的增量,也可能忘记了 i 和 j 与 n 和 n-1 的比较。内部循环运行 n*(n-1) 次,而不是 n*n(或 (n-1)*(n-1),伪代码语法很奇怪)。指出您和您的老师所犯的所有错误可能不会成为一个很好的Stack Overflow 答案。 @user3080953 是对的 - 我们需要知道您应该计算什么,因为该决定会导致非常不同的常数因素。

标签: algorithm loops time complexity-theory notation


【解决方案1】:

这是我对标记方案的看法,明确标记了他们计数的操作。似乎他们在计算作业(但很方便地忘记了需要 2 或 3 个作业才能进行交换)。这就解释了为什么它们计算增量而不是 [i-1] 索引。

计算掉期

i loop runs n times
    j loop runs n-1 times (~n^2-n)
        swap (happens n^2 times)            n^2

计数加法 (+=)

i loop runs n times 
    j loop runs n-1 times (~n^2)
        increment j (happens n^2 times)     n^2
    increment i (happens n times)           n

sum:                                        2n^2 + n

【讨论】:

  • 这实际上非常有帮助 - 标记方案让我有好几个小时的时间。非常感谢!