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
.128013:pM(40zed3;N 1o5_n)h]6,qc[yCuvà8i2+Dms7=ûwlSatf-9ORrg.çéPkbè/050j0i0U0T0H0R0M0n0z0R0T0M0M0O010U0H0c010406050M0D0L0L0T0!0B040S0p0R0D110p0s0n020T0L0c0l0n0Z0i1b0!0y0D0i0M050-181a1c1e160c041C1J051M0-1M1O1J160j0H0E0_0{0}0 0u0H0#0u0R1$0u0U14050;0+0R0i1X0|0~011#1%1)1%0U1/1;1-0U0+0p0j1e1.0!1K0U0u0_1h0M0c0T0s0 0I011?1Z010V0?0i0s1p0i1-2e2g2l1^2o1;2r0L2t040a0n0)0!0p0c0p0M0H1k1m0/2c0!0!0i0z2O1C2v0s1K0-2a2!0U2827290j2x0 1)0s2q2L1-1U1W0`1@2.0H2:0s241V1-0c2T1K2Y2!35172f1m2_2m2~0!1b0R140n0o2X3915382w3b1^3d3f3h0I3k2g3m2Y2-013r0T3g040n0k3v2Z163y3p0 3B3D0n0f3H3x393z3N3h0q3R3J3T3L3A0p3e3C3h0w3Y3n3a1Y3q3%3s3E0N3,3K3/3M3;3)3E0G3^3!3`3$3(3O0X403o423V040o0g473.2`433=0o3j1D3l3Z484g4a0o3u4l3w4n4f3c3|3D0o3G4t3I3-3U4y140o3Q4C3S4o4x444H3X4K4v4F4O4b3+4R4E3#4q3@4X3_4p4G4b3 4K1L331C2@2%0j2+3z0z242D0.1V1K320i343l3R054^0/504M1^0*140/0V524%2m0Q3h5d414p0V142(0H0z0u0p0U0p0L0H0i5i570 13040e5x4w3q5m0T1:0i0T0D5D3z5A0x3R0n4Y49140z0H5I5M3#5A0t0b3Y0n5(5R5e5F040/0+1j5Q5S4g0p140O5;5+0 5u144d4R5)5*5j3c142o0s5`631^5@045_4K625y3A0+142A5Y425A5C4,5{3A5G5I5K6l4g5!686g6b0W6y5E5|0H4H5%5)5=2m59040Q1#1;6C3U5a0i5/0U6Q3#6b020R0U0l6d356f6D6r04666v2m5A5$60616I6q0s5m5v0!0M0r4k6(6J6a5^6W5T5-6T5:6e710 6b0J746w146o376^652|7e2m6A7m5,5.787i695z140t7p7b140-0-7y015}044B35066?6@7u6+110i6|0r4s706q6b6%3l6)6R6,7l797U146B7$7M6n6.5,6-7*6z7(7D6_766U7-7v047x7:6*6b7B7D7F7H4m7K5(7a016L0H5c7~7Z5V5X8d6X146Z6#7?6s1;6u6p7+140A7`7N6{6}6 516q5A0v6;7I866?887@7/7T7M7V8m047O7Q8y3w7Y8i047)8K6g7F8R3I8F886L0i1)8c8X6*7@1 5J5L8q6g5A8t8=8-6`7P8x8u8B7D6Y6!0l8N8f6P8h42918l974p8n8:8~8s8u8.8w7R9f048C6H8F877j7^7s7X888M9b648O9j8!3E9v147d9x1^8Z9o9p8H7k679G7z6c8N8P6}7S9u7%8V826F4b9J618%148)8b9R5H8o8;7t8?9g8_7Z9S9k9=5Z140v908j92945W969/6*6:9#869L9s6V9O019w8,9?9A9}049Fae3#9I6=7K9%049)8+9V7M7@955wab7V7W8Sa88/8pa35N9;aF4Z8{8Q9l9nan9K6q6L2T0U0D0!9Nak759@9B7Ja7aQ9(0@axaI6m148D859p9q7MaR0:aUaWat6g9i8|9^8E7L6ga?aTaV7D0*0z140m1la*4m1C544 4-bf0-4:1C0U4=bk2)2#23252%9,bh4:1I566*2T0L0r0V0T0*0i0r0u0k141u1w1y1A0na.3w1L3m1J0Y1m320p0z0,2Q2QbC0%1l0n2g3C0p0#1z0n0F0n0{0n2T5p7Pb^0n1U5p5r5t0HbM0$bRbw0K2g0^0z0:0U1=0j0(1wb^0x0nb(2@0H0M1=b=0{0!0#0iaUb{cm0T0n0hbactb?2U0ub_cC0n2f0!3Fb/0_0u0TbM0n2N0(0!0T2O0$0nbUcF0paUcR2Nb{1l0zcF2qclcHcNc81~1=0L0(2a4_0n1A0UcF1i0^0i0V2o0z0Tc80ncNb=b@cC0!b`b|5q5s5ucN1y0HcgbC1j0W0?b;1=cR0c0c8)7Pcgcjclb;cvcx2:czd7cD1=cG0n0IcJ5pcMb.c=0Tdrc21PbS040C1=0#0=1mcv5s1jc~0pck0n0D3a0p0Pc`0bdxcAb^d9cE5nb}ddc0b.c~0V2UaT1=2q0n0L0p0B2qdA0cc|cz4^1q1c0=0M1l0^d5cvdbb~5u1=3pd`0icUc50s0^1;0_0|b{00d)docBdDb{c6d(1maD0Dey2q9Scgc8b=cvdreJ0j000H1q3%0;0sc8cU0dee0n2Mb;002JcQcS0Hcien5tcGeeb(014^d,2tcKdt0_bNe,cR2O0^18dq0RcdeL0=2T0^eR0EeLcF0(2r1)c+d/c;c?2Qd.d6eCd=cb5odcb cNc+eQe9d|5od2eqc34/0:0=0@04.