Ви можете просто порахувати кількість перетворень у списку.
Інверсія
Інверсія в послідовність елементів типу T
- це пара елементів послідовності, які виходять з ладу згідно з деяким упорядкуванням <
на множині T
s.
З Вікіпедії :
Формально, нехай це A(1), A(2), ..., A(n)
буде послідовність n
чисел.
Якщо i < j
і A(i) > A(j)
, то пара (i,j)
називається інверсією з A
.
Інверсії номер послідовності одна загальна міра його або порівняння .
Формально число інверсії визначається як кількість інверсій, тобто
Щоб зробити ці визначення більш зрозумілими, розглянемо приклад послідовності 9, 5, 7, 6
. Ця послідовність має інверсії (0,1), (0,2), (0,3), (2,3)
та номер інверсії 4
.
Якщо потрібно значення між 0
і 1
, ви можете розділити число інверсії на N choose 2
.
Для того, щоб створити алгоритм для обчислення цього бала для сортування списку, у вас є два підходи:
Підхід 1 (детермінований)
Змініть свій улюблений алгоритм сортування, щоб відстежувати, скільки інверсій він виправляє під час його запуску. Хоча це нетривіально і має різні реалізації в залежності від вибраного алгоритму сортування, ви отримаєте алгоритм, який не є дорожчим (за складністю), ніж алгоритм сортування, з якого ви почали.
Якщо ви їдете цим маршрутом, пам’ятайте, що це не так просто, як підрахунок «свопів». Наприклад, Mergesort - це найгірший випадок O(N log N)
, але якщо він ведеться за списком, відсортованим у порядку зменшення, він виправить усі N choose 2
інверсії. Це O(N^2)
виправлення, виправлені в O(N log N)
операціях. Тому деякі операції неминуче повинні виправляти більше однієї інверсії одночасно. Ви повинні бути обережними у своїй реалізації. Зауважте: ви можете зробити це O(N log N)
складно, це просто хитро.
Пов'язане: обчислення кількості "інверсій" у перестановці
Підхід 2 (стохастичний)
- Випадково вибіркові пари
(i,j)
, деi != j
- Для кожної пари визначте, чи
list[min(i,j)] < list[max(i,j)]
(0 або 1)
- Обчисліть середнє значення цих порівнянь, а потім нормалізуйте
N choose 2
Я особисто пішов би зі стохастичним підходом, якщо у вас немає вимоги точності - хоча б тому, що це так просто здійснити.
Якщо ви дійсно хочете - це значення ( z'
) між -1
(відсортовано за спаданням) до 1
(відсортовано за зростанням), ви можете просто зіставити значення вище ( z
), яке знаходиться між 0
(сортування за зростанням) та 1
(відсортоване за спаданням), до цього діапазону, використовуючи цю формулу :
z' = -2 * z + 1