Aller au contenu

Tas-Min

Définition d'un Tas

On définit un Tas-Min comme une structure arborescente de type arbre binaire, mais en plus :

  • presque complet à gauche,
  • telle que tous les nœuds portent des informations comparables,
  • un nœud porte une information inférieure ou égale à celle de toute valeur des sous-arbres.

Ainsi, la racine (si elle existe) porte la valeur minimale du Tas. De plus, on constate qu'un sous-arbre d'un Tas-Min est un Tas-Min également, éventuellement vide.

Un exemple numérique
graph TD
    R{10} --> N1{42}
    R     --> N2{23}
    N1    --> N3{55}
    N1    --> N4{67}
    N2    -.-> N5( )
    N2    -.-> N6( )
    N3    -.-> N7( )
    N3    -.-> N8( )
    N4    -.-> N9( )
    N4    -.-> N10( )
  • C'est un arbre binaire, chaque nœud possède deux sous arbres, un à gauche, un à droite qui sont des arbres binaires (éventuellement vides).
  • L'arbre est presque complet à gauche : tous les niveaux sont remplis, sauf éventuellement le dernier, pour lequel les nœuds sont groupés à gauche. Dit autrement : il ne manque, éventuellement, que des nœuds à droite au dernier niveau pour obtenir un arbre binaire parfait.
  • On a bien \(55 \geqslant 42 \geqslant 10\), mais aussi \(67 \geqslant 42 \geqslant 10\) et \(23 \geqslant 10\)

Avec des chaines de caractères

On peut utiliser l'ordre lexicographique (l'ordre du classement des mots).

On n'est pas obligé de dessiner les arbres Nil (les arbres vides).

graph TD
    R{'brrr'} --> N1{'chut'}
    R    --> N2{'ouille'}
    N1   --> N3{'dring'}
    N1   --> N4{'tada'}
    N2   --> N5{'vroum'}
    N2   --> N6{'wahou'}
    N3   --> N7{'paf'}
    N3   --> N8{'hehe'}

Avec l'ordre lexicographique, on a bien 'brrr' qui est le minimum de la structure.

Il ne manque des nœuds qu'au dernier niveau, les nœuds y sont groupés à gauche.

Modélisation d'un Tas-Min

Comme tous les arbres binaires presque complets à gauche, on peut utiliser un tableau pour modéliser un Tas-Min : celui obtenu à l'issu d'un parcours en largeur.

🐍 Console Python
>>> # indices         0   1   2   3   4
>>> tas_de_nombres = [10, 42, 23, 55, 67]
🐍 Console Python
>>> # indices       0       1       2         3        4       5        6        7      8
>>> tas_de_mots = ['brrr', 'chut', 'ouille', 'dring', 'tada', 'vroum', 'wahou', 'paf', 'hehe']

Avec un tas d'effectif \(n\), stocké dans un tableau de taille \(n\), les propriétés importantes avec cette modélisation sont :

  • Si \(n > 0\), le nœud d'indice \(0\) est la racine. Si \(n = 0\), le tas est vide.
  • Pour \(i > 0\), l'élément tableau[i] a pour ancêtre tableau[(i - 1) // 2]
  • Si \(2i+1 < n\), l'enfant à gauche de tableau[i] est tableau[2*i + 1]
  • Si \(2i+2 < n\), l'enfant à droite de tableau[i] est tableau[2*i + 2].

Par exemple,

🐍 Console Python
>>> tas_de_mots[3]
'dring'
>>> tas_de_mots[3 // 2]   # l'ancêtre de 'dring'
'chut'
>>> tas_de_mots[3*2]      # l'enfant à gauche de 'dring'
'paf'
>>> tas_de_mots[3*2 + 1]  # l'enfant à droite de 'dring'
'hehe'

L'objectif de l'exercice est d'écrire une fonction telle que est_tas_min(tableau) détermine, en renvoyant un booléen, si tableau modélise un Tas-Min. On garantit que tableau sera rempli de valeurs comparables.

Exercice

Coder une fonction est_tas_min qui prend en paramètre la liste issue du parcours_largeur d'un arbre binaire ab presque complet à gauche et qui renvoie un booléen : True si ab est un tas-min, False sinon.

###(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 : /
.128013x/.Tr;nbylaeêu)d63m(P+2è-],5fq N_o=pcwgv4F1kRIéhtsSàL[ji:050q0m0X0l0(0k0Y0F0L0k0l0Y0Y0J010X0(0K010406050Y0o0t0t0l0f0j040Z0I0k0o0}0I0h0F020l0t0K0g0F0T0m170f0E0o0m0Y050c1416181a120K04051F1y1I0c1F120q0(0O0=0@0_0{0W0(0N0W0k1W0W0X10050-0i0k0m1R0^0`011V1X1Z1X0X1)1+1%0X0f1G0X0W1-1T010D0/0m0h1l0m010=1d0Y0K0l0h0{0x1%2d2f211/241+270t29040a0F0v0f0I0K0I0Y0(1g1i0+2b0f0f0m0L2D1y2k0h1G0c1 2P1|1~1}1(0q2m0{1Z0h262A1%1O1Q0?1.2Z0(2#0h0I2)1%0K2I1G2N2P2`132e1i2+222:0f170k100R2M2~112}2l301/3234100x382f3a2N2Y013f0l35040s3j2O123m3d0{3p3r0P3u3l2~3n3A100C3D3w3F3y3o0I333q100r3D1J2^1y2)2S0q1~2X3N0L2;2s0*1P1G2@0m2_393U3(0+3:3c1S1/0S100+0D3U3x3`0{0M100F403M423o0D101w0X0H0-0Y0H0t2.473_2,010 040u4l2 490h101_0m0l0o4s3n4p0p0)3K0F4H46414n4v040h3D4J484n0I100J4P3b4t4L0i102p4B3N4p4r1z3;4K314w0l1*4y4A4+3k4X4C100p4G4I4_3N3|040D3P4W4-3e100(554R220I44044k4@2O4Q4m314!040f2f0N0m4%494)5s4n4j365v224p0B5a5k574N5z1/4D4F5h114I5N5j4Y22510(3 5L5P3G4/4;4z5H0{4p0$4*2|563z585D5Q1/4T040z5.3n5x04375L4 5t4{5@3N5;0c0c60495_3i5|5+4o100A654S10020N0X0g6e4.044x5!695b5I100$5#3o5-6q5E5$6c5K2`065O6F5W50102I0X0o0f4O5V5}4n0S0L100Q3q0Y5r5L6E4~6a516K6M6O2`6H496S100e0f1v3K1y3?3/3V6_0c3Y1y0X3!6~2V2Q4:1+2P3Y1E3^5/0{2I0t0H0D0l0S0m0H0W0s101q1s1u1w0F6C3;1L3a1I6a182C0W170X0m0b10090u0h0w0R094|5V4d0F0i0(260F0@0F0-0/1+0F2F056^6n744=6@3)040B7T7q2.1O0L7q2z6M7.0;0V0k0V2r0h0X0;0u0W3P0;7#7+0G1h6Y7$0p0F0Y1h0X7Z1,6Q227y1 7B7D7F0u7K7M6+0!6,4n8l7A0l7C7E047G0h7L4P2.0?0o0Y0d1J7v040#7/0h7;7q0+7`7|7~800F1u0(0F2z0_0y0+7 0F0o1i2f0L0n1|1,8e8+7!7x0f7z8n8B7G0x8F5V8H1e0;8u8j1/8x8}8p7I8r4P7D8I8L7u780U0k8d0o0D248g0%8J7C8h0F0O0V8{240m0f8Z1v0=0W0l7p0F8/8;2I0F0h007O2e0;140K9x7R6M9h1M3X0,0.0:04.