Merge 合并排序合并运行时分析

Merge 合并排序合并运行时分析,merge,runtime,Merge,Runtime,我对merge sort中merge函数的运行时分析感到有些困惑 Merg(A,p,q,r) 1 n1=q-p+1 2 n2=r-q 3 let L[1..n1+1] and R[1..n2+1] be new arrays 4 for i=1 to n1 5 L[i] = A[p+i-1] 6 for j =1 to n2 7 R[j] = A[q+j] 8 L[n1+1] = infinity 9 R[n2+1] = infinity 10 i =0 11 j=0 12 fo

我对merge sort中merge函数的运行时分析感到有些困惑

Merg(A,p,q,r)
1 n1=q-p+1
2 n2=r-q
3 let L[1..n1+1] and R[1..n2+1] be new arrays
4 for i=1 to n1
5     L[i] = A[p+i-1]
6 for j =1 to n2
7    R[j] = A[q+j]
8  L[n1+1] = infinity
9 R[n2+1] = infinity
10 i =0
11 j=0
12 for k=p to r
13   if L[i]<=R[j]
14       A[k]=L[i]
15       i=i+1
16    else A[k] = R[j]
17       j=j+1
Merg(A,p,q,r)
1 n1=q-p+1
2 n2=r-q
3设L[1..n1+1]和R[1..n2+1]为新阵列
i=1至n1时为4
5l[i]=A[p+i-1]
j=1至n2时为6
7 R[j]=A[q+j]
8 L[n1+1]=无穷大
9 R[n2+1]=无穷大
10i=0
11 j=0
12表示k=p到r

13如果L[i]第1行到第9行只是将输入(
A
)分成两部分(
L
R
)。第10行和第11行正在进行一些初始化以准备合并。合并本身来自第12-17行

注意,第12行之前的所有内容(或者可以说是第10行,并不重要)都与分析合并无关,因为它们都不是合并的一部分


编辑:但是,最终,从1到27的单个迭代是线性的:在第4-7行中,您在输入数组中遍历一次,将每个输入精确地分配给L或R。在第12-27行中,您遍历这两个部分,并将它们复制回原始输入。忽略其他一些小细节,如初始化
i
j
,操作总数正好是2N。对于big-O表示法,常量因子被忽略,因此它是O(N)。

它写得很混乱。两个循环(4-7和12-17)具有相同的长度(n),并且两个循环的内部都是恒定时间(无嵌套循环)。所以他们每个都是O(n),对于整个程序,总共是O(n)


关于Jerry的回答,第4-7行很重要,因为它们仍然是O(n)。如果你能神奇地删除第12-17行,你仍然会有一个O(n)例程。

好吧,这也是我的假设,但书中说O(n)运行时间来自第4-7行,而不是第12-27行哦哇。我是哑巴哈哈。出于某种原因,我认为它们是嵌套的,这将使它成为O(n^2),但它实际上是2n,也就是O(n)。书中的解释肯定不是用最好的方式写的,但我现在明白了。谢谢