我正在阅读“算法介绍,第2版”。它有一个练习,问题2.4
设A [1 n]是n个不同数字的数组。如果我< j和A [i]> A [j],则对(i,j)称为A的反转。
d。给出一种算法,该算法确定Θ(n lg n)最坏情况时间内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
我的问题是,我发现变量计数真的没用。在第一个if子句中,它可能设置为 TRUE ,但这意味着R [J]&lt; L [i],所以在最后一个else子句中,它将被设置回 FALSE 。
有人能给我一个例子来解释为什么需要计算吗?
答案 0 :(得分:2)
你是对的,counted
变量是无用的,因为它在测试时总是错误的。
看起来作者的目的是避免两次计算相同的R[j]
元素。但他们没有注意到,在计算R[j]
后,由于进入j
条款,else
将始终递增,因此不需要采取预防措施。