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.
n-1
flips? Je ne peux prouver qu'une limite inférieure d'environ 50.