Il s'agit du plus petit défi d' opérations où l'objectif est de trier un vecteur par ordre croissant en utilisant le moins d'inversion possible. Votre algorithme ne peut trier le vecteur qu'en utilisant des "inversions de sous-vecteur" 1 , mais il peut utiliser d'autres opérations pour des opérations arithmétiques, des boucles, vérifier s'il est trié, etc. Le nombre d'inversions de sous-vecteur que votre algorithme effectue est son score.
1 Une "inversion de sous-vecteur":
- Sélectionnez une plage de nombres dans le vecteur et inversez les éléments de cette plage.
Pour donner un exemple simple, si vous commencez avec le vecteur {4,3,2,1}
, vous pouvez le trier de différentes manières:
- Inversez le vecteur entier. C'est évidemment l'approche la plus courte car elle ne nécessite qu'un seul renversement:
{4,3,2,1} -> {1,2,3,4}
- Vous pouvez faire une version du tri à bulles, qui nécessite 6 inversions:
{4,3,2,1} -> {3,4,2,1} -> {3,2,4,1} -> {2,3,4,1} -> {2,3,1,4} -> {2,1,3,4} -> {1,2,3,4}
- Vous pouvez commencer par les 3 premiers éléments, puis les trois derniers, et enfin les deux premiers et les deux derniers, ce qui nécessite 4 swaps:
{4,3,2,1} -> {2,3,4,1} -> {2,1,4,3} -> {1,2,4,3} -> {1,2,3,4}
- ... etc. Il existe une infinité d'options disponibles (vous pouvez répéter n'importe quelle opération si vous le souhaitez).
Règles et exigences:
Votre code doit se terminer en moins d'une minute pour une liste de 100 chiffres. Vous pouvez chronométrer cela vous-même, mais veuillez jouer juste 2 .
Vous devez stocker les indices de début et de fin de tous les swaps que vous effectuez, afin que la solution puisse être vérifiée. (Je vais expliquer ce que cela signifie ci-dessous).
Le code doit être déterministe.
Vous pouvez prendre l'entrée dans le format de votre choix: vecteur numérique, liste chaînée, tableau de longueur ... tout ce que vous voulez.
Vous pouvez faire ce que vous voulez sur une copie du vecteur. Cela implique de tenter différentes inversions et de vérifier laquelle est la plus efficace. Le forçage brutal est parfaitement bien, mais respectez la limite de temps.
Le score est le nombre total de flips pour les 5 vecteurs de test. Le bris d'égalité portera la date.
Exemple:
4 1 23 21 49 2 7 9 2 | Vecteur / liste initial 4 1 2 9 7 2 49 21 23 | (2, 8) (inversé les éléments entre les indices 2 et 8) 4 1 2 2 7 9 49 21 23 | (3, 5) 4 1 2 2 7 9 23 21 49 | (6, 8) 4 1 2 2 7 9 21 23 49 | (6, 7) 2 2 1 4 7 9 21 23 49 | (0, 3) 1 2 2 4 7 9 21 23 49 | (0, 2)
Le score serait de 6, puisque vous avez effectué 6 inversions. Vous devez stocker (et non imprimer) les index répertoriés sur le côté droit dans un format approprié qui peut facilement être imprimé / édité à des fins de vérification.
Vecteurs de test:
133, 319, 80, 70, 194, 333, 65, 21, 345, 142, 82, 491, 92, 167, 281, 386, 48, 101, 394, 130, 111, 139, 214, 337, 180, 24, 443, 35, 376, 13, 166, 59, 452, 429, 406, 256, 133, 435, 446, 304, 350, 364, 447, 471, 236, 177, 317, 342, 294, 146, 280, 32, 135, 399, 78, 251, 467, 305, 366, 309, 162, 473, 27, 67, 305, 497, 112, 399, 103, 178, 386, 343, 33, 134, 480, 147, 466, 244, 370, 140, 227, 292, 28, 357, 156, 367, 157, 60, 214, 280, 153, 445, 301, 108, 77, 404, 496, 3, 226, 37
468, 494, 294, 42, 19, 23, 201, 47, 165, 118, 414, 371, 163, 430, 295, 333, 147, 336, 403, 490, 370, 128, 261, 91, 173, 339, 40, 54, 331, 236, 255, 33, 237, 272, 193, 91, 232, 452, 79, 435, 160, 328, 47, 179, 162, 239, 315, 73, 160, 266, 83, 451, 317, 255, 491, 70, 18, 275, 339, 298, 117, 145, 17, 178, 232, 59, 109, 271, 301, 437, 63, 103, 130, 15, 265, 281, 365, 444, 180, 257, 99, 248, 378, 158, 210, 466, 404, 263, 29, 117, 417, 357, 44, 495, 303, 428, 146, 215, 164, 99
132, 167, 361, 145, 36, 56, 343, 330, 14, 412, 345, 263, 306, 462, 101, 453, 364, 389, 432, 32, 200, 76, 268, 291, 35, 13, 448, 188, 11, 235, 184, 439, 175, 159, 360, 46, 193, 440, 334, 128, 346, 192, 263, 466, 175, 407, 340, 393, 231, 472, 122, 254, 451, 485, 257, 67, 200, 135, 132, 421, 205, 398, 251, 286, 292, 488, 480, 56, 284, 484, 157, 264, 459, 6, 289, 311, 116, 138, 92, 21, 307, 172, 352, 199, 55, 38, 427, 214, 233, 404, 330, 105, 223, 495, 334, 169, 168, 444, 268, 248
367, 334, 296, 59, 18, 193, 118, 10, 276, 180, 242, 115, 233, 40, 225, 244, 147, 439, 297, 115, 354, 248, 89, 423, 47, 458, 64, 33, 463, 142, 5, 13, 89, 282, 186, 12, 70, 289, 385, 289, 274, 136, 39, 424, 174, 186, 489, 73, 296, 39, 445, 308, 451, 384, 451, 446, 282, 419, 479, 220, 35, 419, 161, 14, 42, 321, 202, 30, 32, 162, 444, 215, 218, 102, 140, 473, 500, 480, 402, 1, 1, 79, 50, 54, 111, 189, 147, 352, 61, 460, 196, 77, 315, 304, 385, 275, 65, 145, 434, 39
311, 202, 126, 494, 321, 330, 290, 28, 400, 84, 6, 160, 432, 308, 469, 459, 80, 48, 292, 229, 191, 240, 491, 231, 286, 413, 170, 486, 59, 54, 36, 334, 135, 39, 393, 201, 127, 95, 456, 497, 429, 139, 81, 293, 359, 477, 404, 129, 129, 297, 298, 495, 424, 446, 57, 296, 10, 269, 350, 337, 39, 386, 142, 327, 22, 352, 421, 32, 171, 452, 2, 484, 337, 359, 444, 246, 174, 23, 115, 102, 427, 439, 71, 478, 89, 225, 7, 118, 453, 350, 109, 277, 338, 474, 405, 380, 256, 228, 277, 3
Je suis assez certain que trouver une solution optimale est difficile à NP (car le tri régulier des crêpes l'est).
2 Oui, les personnes disposant d'ordinateurs très rapides peuvent avoir un avantage, en raison du délai d'une minute. Après de nombreuses discussions, j'ai pensé qu'il était préférable que chacun fasse son propre benchmarking, ce n'est pas un défi de code le plus rapide.
la source
n-1
flips? Je ne peux prouver qu'une limite inférieure d'environ 50.Réponses:
Java, algorithme génétique, 80 + 81 + 79 + 78 + 80 = 398 (auparavant
418)Après avoir essayé un tas d'idées différentes et échoué la plupart du temps, je me suis installé sur cet algorithme: commencez par le tableau d'entrée, essayez toutes les inversions possibles et conservez un certain nombre de résultats avec le plus petit nombre d'exécutions, puis faites de même pour ces résultats, jusqu'à ce que nous obtenons un tableau trié.
Par "exécutions", j'entends des sous-réseaux maximaux qui apparaissent exactement ou inversés dans le tableau trié. Fondamentalement, ce sont des sous-réseaux triés maximaux, mais en cas d'éléments répétés, le nombre d'éléments au milieu doit correspondre. Par exemple, si le tableau trié est
2, 2, 3, 3, 4, 4
alors4, 3, 3, 2
une exécution mais2, 2, 3, 4
ne l'est pas (et ni l'un ni l'autre2, 3, 2
).Dans cette version, j'ai optimisé l'algorithme pour inverser uniquement aux limites de l'analyse et uniquement si une analyse inversée peut être jointe à une analyse nouvellement adjacente. De plus, les exécutions sont ajustées et jointes à chaque étape, pour éviter de les recalculer à partir du tableau modifié. Cela m'a permis d'augmenter la "taille de la population" de 30 à environ 3000, et d'exécuter plusieurs simulations à différentes tailles.
L'entrée est une liste de nombres séparés par une virgule et / ou un espace (de stdin). Si l'entrée est vide, le programme exécute les 5 tests. Chacun prend environ 40 secondes ici.
la source
Un coup par force brute puis tri par sélection (également solution naïve), 90 + 89 + 88 + 87 + 89 = 443 coups
pour chaque premier mouvement possible, essayez-le, puis effectuez un tri par sélection.
Oui, c'est une autre solution naïve.
Je ne suis pas sûr que cela devrait être une modification ou un autre post, mais il semble que la solution soit trop simple, donc la modification est choisie.
Tri de sélection (solution naïve), 92 + 93 + 95 + 93 + 96 = 469 coups
Une solution naïve utilise le tri par sélection.
Il DOIT y avoir de meilleures solutions, mais postez cela car je n'en ai pas trouvé de meilleure (sans recherche par force brute).
(Le code ci-dessus est JavaScript Shell )
la source