Vous pouvez simplement compter le nombre d'inversions dans la liste.
Inversion
Une inversion dans une séquence d'éléments de type T
est une paire d'éléments de la séquence qui apparaissent hors de l'ordre, selon certains de la commande <
sur l'ensemble de l' T
'.
De Wikipedia:
Officiellement, laissez - A(1), A(2), ..., A(n)
être une séquence de n
numéros.
Si i < j
et A(i) > A(j)
, puis la paire (i,j)
s'appelle une inversion de A
.
L' inversion de numéro de séquence est une mesure commune de son sortedness.
Officiellement, l'inversion nombre est le nombre d'inversions, qui est,
Pour faire ces définitions plus clair, prenons l'exemple de la séquence de 9, 5, 7, 6
. Cette séquence a les inversions (0,1), (0,2), (0,3), (2,3)
et l' inversion nombre 4
.
Si vous voulez une valeur comprise entre 0
et 1
, vous pouvez diviser l'inversion nombre en N choose 2
.
Pour créer un algorithme pour le calcul de ce score pour comment triés une liste, vous avez deux approches:
Approche 1 (Déterministe)
Modifier votre favori algorithme de tri pour garder une trace de la façon dont de nombreuses inversions c'est la correction, car il fonctionne. Si ce n'est pas négligeable et a différentes implémentations en fonction de l'algorithme de tri que vous choisissez, vous allez vous retrouver avec un algorithme qui n'est pas plus coûteuse (en termes de complexité) que l'algorithme de tri que vous avez commencé avec.
Si vous prenez cette route, sachez que ce n'est pas aussi simple que de compter "swaps." Mergesort, par exemple, est le pire des cas O(N log N)
, mais s'il est exécuté sur une liste triée dans l'ordre décroissant, il va corriger tous N choose 2
des inversions. C'est O(N^2)
inversions corrigé en O(N log N)
des opérations. De sorte que certaines opérations doivent inévitablement être la correction de plus d'une inversion à la fois. Vous devez être prudent avec votre mise en œuvre. Remarque: vous pouvez le faire avec O(N log N)
de la complexité, c'est difficile.
Liés: le calcul du nombre de "inversions" dans une permutation
Approche 2 (Stochastique)
- Au hasard de l'échantillon paires
(i,j)
où i != j
- Pour chaque paire, de déterminer si l'
list[min(i,j)] < list[max(i,j)]
(0 ou 1)
- Calculer la moyenne de ces comparaisons, et puis normaliser en
N choose 2
Personnellement, je ne aller avec l'approche stochastique, sauf si vous avez une exigence d'exactitude - si seulement parce qu'il est si facile à mettre en œuvre.
Si ce que vous voulez vraiment est une valeur (z'
) entre -1
(tri décroissant) 1
(classés dans l'ordre croissant), vous pouvez tout simplement la carte de la valeur au-dessus de (z
), qui est entre 0
(classés dans l'ordre croissant) et 1
(tri décroissant), à cette plage à l'aide de cette formule:
z' = -2 * z + 1