【发布时间】: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