Algorithm 计算大O互换、计算和比较
查看下面的代码:Algorithm 计算大O互换、计算和比较,algorithm,loops,time,complexity-theory,notation,Algorithm,Loops,Time,Complexity Theory,Notation,查看下面的代码: 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^
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回路中执行交换操作
- 交换(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次
- 1标识j循环的标记将执行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表示数组等
谢谢大家! 这是我对标记方案的看法,明确标记他们正在计算的操作。他们似乎在计算任务(但很容易忘记交换需要2到3个任务)。这就解释了为什么它们只计算增量而不计算索引 计算掉期 计数加法(
+=
)
我不确定n^3是从哪里来的,它是一个冒泡排序,在O(n^2)中运行。你必须修正你的格式才能得到答案,因为你问的不清楚。如果你不想要渐近复杂性,它是+n还是+2n并不重要。如果您要查找确切的复杂性,则必须选择定义为基本操作的内容(在本例中可能是交换),n^3在标记方案中给出。我也知道,你不需要+n等的整体,但他们在分数方案。第一部分是我对它的看法,第二部分是分数方案。我很确定n^3是错的,你得问问你的老师/教授。(顺便说一句,您可以用
#
标记标题,这可能会帮助您更好地组织问题)谢谢!希望现在更清楚一点,n^3看起来像一个简单的键入错误,因为它与文本的其余部分不一致。你的老师似乎也忘记了j的增量,也可能忘记了i和j与n和n-1的比较。内部循环运行n*(n-1)次,而不是n*n(或(n-1)*(n-1),伪代码语法很奇怪)。指出你和你老师犯的所有错误可能不是一个很好的答案@user3080953是对的-我们需要知道你需要计算什么,因为这个决定会导致非常不同的常数因子。这实际上是非常有用的-分数方案让我有好几个小时的偏差。非常感谢你!
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