Insertion efficace dans la liste en gardant un nombre minimal d'inversions

15

Supposons deux listes d'éléments comparables: u et s. Soit INV (u) le nombre d'inversions dans u.

Je recherche un algorithme efficace pour insérer les éléments de s dans u avec une augmentation minimale de INV (u).

Fondamentalement, je voudrais insérer des objets dans une liste tout en la gardant "aussi triée que possible" tout en gardant l'ordre de la première liste.

Exemple:

u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)

s = [8,3,10]

one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))

different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))

Comme vous pouvez le voir, il n'y a pas de solution optimale unique.

Je serais heureux de toute idée ou direction à examiner.

trevore
la source
Matière à réflexion: l'approche naïve serait la suivante: prendre un élément de s, le comparer à chaque élément de u de gauche à droite, incrémenter s'il s'agit d'une inversion et reporter le nombre calculé précédemment. Parcourez ensuite la liste de droite à gauche avec le même élément, en augmentant le nombre pour chaque position. Cela s'exécute dans O (| s | * | u |) avec espace = O (| u |)
trevore
1
L'inspection de toutes les sous-séquences croissantes maximales peut mener quelque part.
Raphael

Réponses:

2

Ceci est une élaboration sur la réponse de Trevore. Il est trop long pour tenir dans un commentaire et contient les preuves de sa solution (ou du moins comment je la comprends).

Vous pouvez montrer que dans toute solution optimale, les éléments de apparaîtront ordonnés. sSinon, supposez et ils apparaissent dans l'ordre inverse dans une solution optimale. Soit le nombre d'éléments entre et qui sont inférieurs à et le nombre de ceux qui sont plus grands que . Définissez et même manière pour . Notez que et . Permutation etσ 1 s 1 s 2 s 1 β 1 s 1 σ 2 β 2 s 2 σ 1σ 2 β 2β 1 s 1 s 2 - β 1 + β 2 - σ 2 + σ 1 - 1s1<s2σ1s1s2s1β1s1σ2β2s2σ1σ2β2β1s1s2changera le nombre d'inversions de qui est au plus -1.β1+β2σ2+σ11

Il n'est pas difficile de voir que les éléments de peuvent être insérés indépendamment. sPuisqu'ils paraissent ordonnés, les éléments de ne se «sentent» pas mutuellement. Autrement dit, les paires d'éléments de ne contribuent pas au nombre d'inversion. Pour ce faire, insérez la médiane de manière optimale dans le temps linéaire. Ensuite, récursivement, insérez des éléments de inférieurs à la médiane à gauche de la médiane et des éléments plus grands que la médiane à sa droite.s s sssss

Soit la médiane insérée en position , le temps d'exécution de ceci satisfait,, le linéairefacteur est de trouver la médiane et traînant les éléments de . Il est facile de montrer par induction que .T ( | s | , | u | ) = T ( | s | / 2 , | u | - k ) + T ( | s | / 2 , k ) + | u | + | s | | s | s T ( | s | , | u | ) = OkT(|s|,|u|)=T(|s|/2,|u|k)+T(|s|/2,k)+|u|+|s||s|sT(|s|,|u|)=O(|s|log|s|+|u|log|s|)

Notez que la dépendance deici est optimal. Puisque résoudre le problème avec vide équivaut à trier utilisant uniquement des comparaisons. La dépendance deest également optimale, puisque le problème pour une liste singleton et une liste doit exiger un travail linéaire.u s | u | s u|s|us|u|su

aelguindy
la source
Merci d'avoir élaboré. C'est exactement la solution que je voulais dire.
trevore
1

Ok, voici ma solution:

Une observation (que j'ai plus ou moins prouvée) est qu'une solution optimale sera toujours celle dans laquelle s est trié en ordre croissant. Cela donne lieu à un algorithme O ((| u | + | s |) * log (| s |)).

Pour trouver la solution optimale pour un seul élément, faites comme je l'ai dit dans mon commentaire: prenez un élément de s, comparez-le à chaque élément de u de gauche à droite, incrémentez un compteur est une inversion et reportez le nombre précédemment calculé. Parcourez ensuite la liste de droite à gauche avec le même élément, en augmentant le nombre pour chaque position.

C'est O (| u |).

Trier s.

Pour l'élément central de s à la position m: Trouvez la meilleure position b dans u (en utilisant la méthode ci-dessus).

Divisez s en m et u en b et appelez récursivement avec les parties gauche et droite, concaténant les résultats avec m dans le bon ordre.

Arrêtez dès que u ou s sont vides.

trevore
la source
Je ne comprends pas ça. s est une entrée. Vous ne pouvez pas supposer que s est trié. Votre algorithme doit fonctionner pour toutes les valeurs possibles de s.
DW
Oui, mais dans toute solution optimale, les éléments de s finiront toujours par être triés en ordre croissant dans le nouveau tableau. Notez l'étape "Trier s." Voir l'exemple ci-dessus. Ce que j'ai prouvé jusqu'à présent, c'est que: pour a, b dans s, a <b si a est placé de manière optimale dans u, alors l'endroit optimal pour b est à droite de a.
trevore