Подсчет инверсий с помощью merge-sort

Я читаю "введение алгоритма, 2-е издание". У него есть упражнение, проблема 2.4

пусть A[1 n] - массив из n различных чисел. Если i A[j], то пара (i, j) называется инверсией A.

d. Дайте алгоритм, определяющий число инверсий в любой перестановке на n элементах в worst (N lg 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 может быть установлено значение правда, но это означает R[J] FALSE.

может ли кто - нибудь дать мне пример, который мог бы объяснить, почему пересчитать - это?

1 ответов


ты прав,counted переменная бесполезна, так как она всегда будет ложной при тестировании.

похоже, что намерение автора состояло в том, чтобы не считать то же самое R[j] элемент дважды. Но они не заметили этого после подсчета!--1-->, j всегда будет увеличиваться из-за перехода в else пункт, поэтому нет необходимости в предосторожностях.