Aller au contenu

Recherche trichotomique⚓︎

On souhaite dans cet exercice adapter la recherche dichotomique.

Cet algorithme recherche une valeur dans un tableau dont les éléments sont triés dans l'ordre croissant. À chaque itération, la recherche dichotomique partage le tableau en deux zones séparées par un cas limite. On compare alors la valeur cherchée à la valeur limite. Trois cas se présentent :

  • la valeur cherchée est strictement inférieure à la valeur limite : on continue la recherche dans la partie gauche du tableau,
  • la valeur cherchée est strictement supérieure à la valeur limite : on continue la recherche dans la partie droite du tableau,
  • ces deux valeurs sont égales : on a trouvé l'élément cherché.

On souhaite adapter cet algorithme en partageant le tableau en trois zones (et donc deux valeurs limites) : une zone au début, une au centre et une à la fin. Dès lors, la valeur cherchée est soit :

  • strictement inférieure à la première valeur limite : on continue la recherche dans la partie gauche,

  • égale à la première valeur limite : on a trouvé l'élément cherché,

  • comprise, au sens strict, entre les deux valeurs limites : on continue la recherche dans la partie centrale,

  • égale à la seconde valeur limite : on a trouvé l'élément cherché,

  • strictement supérieure à la seconde valeur limite : on continue la recherche dans la partie droite.

Étude de cas

Tableau initial

On cherche la valeur 23.

Première étape

La zone de recherche s'étale entre les indices 0 et 7 (inclus).

La zone de gauche s'étale entre les indices 0 et 1 (inclus).

L'élément séparant les zones de gauche et centrale est à l'indice 2.

La zone centrale entre les indices 3 et 4 (inclus).

L'élément séparant les zones centrale et de droite est à l'indice 5.

La zone de droite entre les indices 6 et 7 (inclus).

La valeur cherchée ne peut-être que dans la zone centrale.

Seconde étape

On a réduit la zone de recherche aux seules cellules d'indices 3 et 4.

Les zones de gauche, centrale et de droite sont vides.

La valeur cherchée est à l'indice 4.

Écrire la fonction trichotomie qui prend en paramètres un tableau d'entiers trié dans l'ordre croissant et une valeur cible et renvoie l'indice de la cible dans le tableau si elle est présente et None si elle est absente.

On garantit que le tableau ne contient que des valeurs distinctes.

On utilisera une recherche trichotomique qui, à chaque étape, partage le tableau en trois zones.

Exemples
>>> tableau = [17, 19, 20, 21, 23, 25, 29, 30]
>>> trichotomie(tableau, 17)
0
>>> trichotomie(tableau, 23)
4
>>> trichotomie(tableau, -1) is None
True
>>> trichotomie(tableau, 24) is None
True
>>> trichotomie(tableau, 50) is None
True
Attention

Les tableaux étudiés sont grands : une recherche linéaire prendra trop de temps.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013s3_8èufvy n7aSû1me(P24C:twi]D[çh)6Oo;bcdgM/0làqp.r-,=+Nzk95Ré050O0s0z0n0B0T0b0k0N0T0n0b0b0#010z0B0W010406050b0g0r0r0n0Y0j040o0K0T0g110K0l0k020n0r0W0L0k0,0s1b0Y0V0g0s0b050R181a1c1e160W041C1J051M0R1M1O1J160O0B0i0_0{0}0 0G0B0P0G0T1$0G0z14050;0M0T0s1X0|0~011#1%1)1%0z1/1;1-0z0M0K0O1e1.0Y1K0z0G0_1h0b0W0n0l0 0v011?1Z010h0?0s0l1p0s1-2e2g2l1^2o1;2r0r2t040a0k0u0Y0K0W0K0b0B1k1m0/2c0Y0Y0s0N2O1C2v0l1K0R2a2!0z2827290O2x0 1)0l2q2L1-1U1W0`1@2.0B2:0l241V1-0W2T1K2Y2!35172f1m2_2m2~0Y1b0T140k0q2X3915382w3b1^3d3f3h0v3k2g3m2Y2-013r0n3g040k0c3v2Z163y3p0 3B3D0k0w3H3x393z3N3h0+3R3J3T3L3A0K3e3C3h0I3Y3n3a1Y3q3%3s3E0m3,3K3/3M3;3)3E0e3^3!3`3$3(3O0*403o423V040q0S473.2`433=0q3j1D3l3Z484g4a0q3u4l3w4n4f3c3|3D0q3G4t3I3-3U4y140q3Q4C3S4o4x444H3X4K4v4F4O4b3+4R4E3#4q3@4X3_4p4G4b3 4K1L331C2@2%0O2+3z0N242D0.1V1K320s343l3R054^0/504M1^0)140/0h524%2m0A3h5d414p0h142(0B0N0G0K0z0K0r0B0s5i570 13040t5x4w3q5m0n1:0s0n0g5D3z5A0!3R0k4Y49140N0B5I5M3#5A0H0y3Y0k5(5R5e5F040/0M1j5Q5S4g0K140#5;5+0 5u144d4R5)5*5j3c142o0l5`631^5@045_4K625y3A0M142A5Y425A5C4,5{3A5G5I5K6l4g5!686g6b0Z6y5E5|0B4H5%5)5=2m59040A1#1;6C3U5a0s5/0z6Q3#6b020T0z0L6d356f6D6r04666v2m5A5$60616I6q0l5m5v0Y0b0d4k6(6J6a5^6W5T5-6T5:6e710 6b0$746w146o376^652|7e2m6A7m5,5.787i695z140H7p7b140R0R7y015}044B35066?6@7u6+110s6|0d4s706q6b6%3l6)6R6,7l797U146B7$7M6n6.5,6-7*6z7(7D6_766U7-7v047x7:6*6b7B7D7F7H4m7K5(7a016L0B5c7~7Z5V5X8d6X146Z6#7?6s1;6u6p7+140E7`7N6{6}6 516q5A0C6;7I866?887@7/7T7M7V8m047O7Q8y3w7Y8i047)8K6g7F8R3I8F886L0s1)8c8X6*7@1 5J5L8q6g5A8t8=8-6`7P8x8u8B7D6Y6!0L8N8f6P8h42918l974p8n8:8~8s8u8.8w7R9f048C6H8F877j7^7s7X888M9b648O9j8!3E9v147d9x1^8Z9o9p8H7k679G7z6c8N8P6}7S9u7%8V826F4b9J618%148)8b9R5H8o8;7t8?9g8_7Z9S9k9=5Z140C908j92945W969/6*6:9#869L9s6V9O019w8,9?9A9}049Fae3#9I6=7K9%049)8+9V7M7@955wab7V7W8Sa88/8pa35N9;aF4Z8{8Q9l9nan9K6q6L2T0z0g0Y9Nak759@9B7Ja7aQ9(0@axaI6m148D859p9q7MaR0:aUaWat6g9i8|9^8E7L6ga?aTaV7D0)0N140%1la*4m1C544 4-bf0R4:1C0z4=bk2)2#23252%9,bh4:1I566*2T0r0d0h0n0)0s0d0G0c141u1w1y1A0ka.3w1L3m1J0J1m320K0N0f2Q2QbC0F1l0k2g3C0K0P1z0k0U0k0{0k2T5p7Pb^0k1U5p5r5t0BbM0XbRbw0D2g0^0N0:0z1=0O0-1wb^0!0kb(2@0B0b1=b=0{0Y0P0saUb{cm0n0k0(bactb?2U0Gb_cC0k2f0Y3Fb/0_0G0nbM0k2N0-0Y0n2O0X0kbUcF0KaUcR2Nb{1l0NcF2qclcHcNc81~1=0r0-2a4_0k1A0zcF1i0^0s0h2o0N0nc80kcNb=b@cC0Yb`b|5q5s5ucN1y0BcgbC1j0Z0?b;1=cR0W0W8)7Pcgcjclb;cvcx2:czd7cD1=cG0k0vcJ5pcMb.c=0ndrc21PbS040x1=0P0=1mcv5s1jc~0Kck0k0g3a0K0pc`0ydxcAb^d9cE5nb}ddc0b.c~0h2UaT1=2q0k0r0K0j2qdA0Wc|cz4^1q1c0=0b1l0^d5cvdbb~5u1=3pd`0scUc50l0^1;0_0|b{00d)docBdDb{c6d(1maD0gey2q9Scgc8b=cvdreJ0O000B1q3%0;0lc8cU0Qee0k2Mb;002JcQcS0Bcien5tcGeeb(014^d,2tcKdt0_bNe,cR2O0^18dq0TcdeL0=2T0^eR0ieLcF0-2r1)c+d/c;c?2Qd.d6eCd=cb5odcb cNc+eQe9d|5od2eqc34/0:0=0@04.