Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用合并排序计数反转_Algorithm - Fatal编程技术网

Algorithm 使用合并排序计数反转

Algorithm 使用合并排序计数反转,algorithm,Algorithm,我正在读“算法简介,第二版”。它有一个练习,问题2.4 设A[1n]是n个不同数的数组。如果iA[j],则该对(i,j)称为A的反转 d。给出一个算法,确定在最坏情况下n个元素上任意排列的逆数。(提示:修改合并排序。) 然后我在讲师手册中找到了这个解决方案 COUNT-INVERSIONS ( A, p, r) inversions ← 0 if p < r then q ← ( p + r)/2 inversions ← inversions +C OUNT-I NVERSIO

我正在读“算法简介,第二版”。它有一个练习,问题2.4

设A[1n]是n个不同数的数组。如果iA[j],则该对(i,j)称为A的反转

d。给出一个算法,确定在最坏情况下n个元素上任意排列的逆数。(提示:修改合并排序。)

然后我在讲师手册中找到了这个解决方案

COUNT-INVERSIONS ( A, p, r)
inversions ← 0
if p < r
  then q ← ( p + r)/2
   inversions ← inversions +C OUNT-I NVERSIONS ( A, p, q)
   inversions ← inversions +C OUNT-I NVERSIONS ( A, q + 1, r)
   inversions ← inversions +M ERGE -I NVERSIONS ( A, p, q, r)
return inversions


MERGE -INVERSIONS ( A, p, q, r)
n1 ← q − p + 1
n2 ← r − q
create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1]
for i ← 1 to n1
  do L[i] ← A[ p + i − 1]
for j ← 1 to n2
  do R[ j ] ← A[q + j ]
L[n 1 + 1] ← ∞
R[n 2 + 1] ← ∞
i ←1
j ←1
inversions ← 0
counted ← FALSE
for k ← p to r
  do 
  if counted = FALSE and R[ j ] < L[i]
    then inversions ← inversions +n1 − i + 1
    counted ← TRUE
  if L[i] ≤ R[ j ]
    then A[k] ← L[i]
    i ←i +1
  else A[k] ← R[ j ]
    j ← j +1
    counted ← FALSE
  return inversions
COUNT-inversion(A,p,r)
倒置← 0
如果p
我的问题是,我发现计数的变量真的没用。在第一个if子句中,它可能被设置为TRUE,但这意味着R[J]FALSE


有谁能给我一个例子来解释为什么需要counted吗?

你是对的,
counted
变量是无用的,因为它在测试时总是错误的

看起来作者的意图是避免将相同的
R[j]
元素计算两次。但是他们没有注意到,在计算
R[j]
之后,
j
总是会因为进入
else
子句而递增,因此没有必要采取预防措施。

R[j]R[j,而不是L[i]