Aller au contenu

🔎 Algorithmes de recherches naïves, avec parcours séquentiel 🔎

Programme

Notions Compétences Remarques
Parcours séquentiel d’un tableau Écrire un algorithme de recherche d’une occurrence sur des valeurs de type quelconque.
Écrire un algorithme de recherche d’un extremum, de calcul d’une moyenne.
On montre que le coût est linéaire.
Activité 1 - Recherche séquentielle

La recherche d'un élément dans une liste est un problème fréquemment rencontré dans les algorithmes.

La façon la plus simple de chercher une valeur dans une liste est de parcourir un à un les éléments de la liste (de manière séquentielle). On compare les éléments à la valeur recherchée.

Compléter la fonction appartient_1 dont les spécifications sont données.

Contrainte

Il est interdit d'écrire if element in tableau:

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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 : 5/5

.128013rt=7flb)1 2eà/vyg.:,-]8Tsw9nuph5aS(o3qLFk_i46P;[cdm0050Y0m0c0H0R0g0z0k0X0g0H0z0z0d010c0R0E010406050z0D0Z0Z0H0b0q040I0K0g0D0^0K0C050o0 1113150}0E04051l1e1o0o1l0}0Y0R0p0-0/0;0?0F0R0r0F0g1C0F0c0{050(0h0g0m1x0:0=011B1D1F1D0c1L1N1J0c0b1m0c0F0-180z0E0H0C0?0l011P1z010f0*0m0C0H0Z0m1J1,1.1?1R1_1N1|1~0{0a0k0U0b0K0E0K0z0R1b0C0k0$1*0b0b0m0X2j1e210C1m0o1(2w1#1%1$1K0Y230?1F0C1{2g1J1u1w0.1Q2G0R2I0C0K2M1J0E2p1m2u2w2!0~1-2k2O1@2T0b120g0{0k0j2t2(0|2%222*1R2,2.2:0l2?1.2^2u2F012}0H2/040k0L312v0}342{0?37390k0S3d332(353j2:0G3n3f3p3h360K2-382:0T3u2_2)1y2|3z2~3a0e3E3g3H3i3J3B3a0x3N3w3P3y3A3k0B3V2`3X3r040j0!3$3G2P3Y3K0j2=1f2@3v3%3/3)0j303@323_3.2+3R390j3c3 3e3F3q440{0j3m483o3`433Z4d3t4g414b4k3*3D4n4a3x3|3M4t3O3{4c3*3U4y3W4A4q0j3#4g1p2Y1e2M2z0Y1%2E3x0X2U1 1m4O1n4M2$4K4U0$2Z4F1@0P0{0$0f3n0k4u3(0f0{0H0E1-0b0^1{0c0Q3?2$4z1@0`040J3n4=3{0{2T0Z0h2p58531R550t4:592+0h0{2R0c5g4*5i0{0u5l5h3i0{1Y0m0H0D5s4i5u045k4g4;5y365o041F0z5r4K5M550i5x5t0?0K0{0v020r0c0V5X5G3i5O0h0K185F425H5J2!4o3x0A2:0k5~5=350z0Y0{020M0D0K5)65676966685*4E5,01625}5~0N0H0k0f1c2r0R1c0k2p0C0p0K0R1O0y0b0D1O2h0k5c5e1O0m5R2l1.0,5Q0c0m0u0k0%0k0O380z6E2R1c3-61633a5~0k0t4{1}6G0K5d2p0t5~6H2p0k0n0k6Q5R0m0b6$3x6j6)5~6,136.5B5D6?6P1O0Y6N0k0/660m0g1N0k6t0p0m1a0k0z0H6x0R0b7r0R6/6;6E1O1#0K0D7o0s713X736*6+2p0c0D0b0C0z6?6B6D7x7z6I6T6L7e7R7g0R6~6S6U6W0+6Z2T1d4n5`7J6(7L5%695(0V7_0V0k4_4{4}0C4 0j0J3}6S0W0L6S0G6S0T6S873b8a0k0G8e0k0B0B0w5W6g5?0?7K6*7U0m7I3/8u5~7}8C7{7 4`1382840J0l0l888i8c0k8l8g0L8O8l8n8p8y1@8A6V6X8x7;5m1R8!6a6e8,6c6b6f5_7L8)5z042p2f7R8%2!5L5Y015!040d5+8s010P0X0{7,6Y3u8?5M4,046p705K8@360{7j0m1~8395350K5|042R9s4v5A0H1M5C5E5T905j9d7L6*9l9g0R4/9k5M0C9n1N9q5S8~9l920d949P909R046^8}2@9l9H4n9J9/8 6h9%8`1c9c9#6h9Y9y3X980{8w3u069e909g7N7P7:9W9Q0{9@8|3E0o4%0m2w2Xai4N1v4P2z2C2x9B1N2w4O0}0o0$0(0*0z04.
Activité 2 - Recherche séquentielle raccourcie

🌵 Le problème de cette technique, c'est qu'on peut continuer à parcourir le tableau jusqu'au bout, pour rien, si on a trouvé l'élément avant la fin.

👉 Il est recommandé de faire une sortie anticipée de la boucle en utilisant le return

Compléter la fonction appartient_2 dont les spécifications sont données en utilisant une sortie anticipée.

Contrainte

Il est interdit d'écrire if element in tableau:

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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 : 5/5

.128013rt=7flb)1 2eà/vyg.:,-]8Tsw9nuph5aS(o3qLFk_i46P;[cdm0050Y0m0c0H0R0g0z0k0X0g0H0z0z0d010c0R0E010406050z0D0Z0Z0H0b0q040I0K0g0D0^0K0C050o0 1113150}0E04051l1e1o0o1l0}0Y0R0p0-0/0;0?0F0R0r0F0g1C0F0c0{050(0h0g0m1x0:0=011B1D1F1D0c1L1N1J0c0b1m0c0F0-180z0E0H0C0?0l011P1z010f0*0m0C0H0Z0m1J1,1.1?1R1_1N1|1~0{0a0k0U0b0K0E0K0z0R1b0C0k0$1*0b0b0m0X2j1e210C1m0o1(2w1#1%1$1K0Y230?1F0C1{2g1J1u1w0.1Q2G0R2I0C0K2M1J0E2p1m2u2w2!0~1-2k2O1@2T0b120g0{0k0j2t2(0|2%222*1R2,2.2:0l2?1.2^2u2F012}0H2/040k0L312v0}342{0?37390k0S3d332(353j2:0G3n3f3p3h360K2-382:0T3u2_2)1y2|3z2~3a0e3E3g3H3i3J3B3a0x3N3w3P3y3A3k0B3V2`3X3r040j0!3$3G2P3Y3K0j2=1f2@3v3%3/3)0j303@323_3.2+3R390j3c3 3e3F3q440{0j3m483o3`433Z4d3t4g414b4k3*3D4n4a3x3|3M4t3O3{4c3*3U4g1p2Y1e2M2z0Y1%2E3x0X2U1 1m4I1n4G2$4E4O0$2Z3W3/0P0{0$0f3n0k4u3(0f0{0H0E1-0b0^1{0c0Q3~2$4z1@0`040J3n4,3{0{2T0Z0h2p524}1R4 0t4*532+0h0{2R0c5a4!4~0{0u5f5b3i0{1Y0m0H0D5m4i5c0{5e4g4+5s365i041F0z5l4E5G4 0i5r5n1R0K0{0v020r0c0V5R5A3i5I0h0K185z425B045D2!4o3x0A2:0k5_5,350z0Y0{020M0D0K5Z60626461635!4y5S0?5}5^5_0N0H0k0f1c2r0R1c0k2p0C0p0K0R1O0y0b0D1O2h0k56581O0m5L2l1.0,5K0c0m0u0k0%0k0O380z6z2R1c3-5|5~3a5_0k0t4=1}6B0K572p0t5_6C2p0k0n0k6L5L0m0b6X3x6e6!5_6%136)5v5x6.6K1O0Y6I0k0/610m0g1N0k6o0p0m1a0k0z0H6s0R0b7m0R6*6,6z1O1#0K0D7j0s6|3X6~6#6$2p0c0D0b0C0z6.6w6y7s7u6D6O6G797M7b0R6_6N6P6R0+6U2T1d4n5=7E6Z7G5X645Y0V7;0V0k4:4=4@0C4_0l0J3}6N0W0L6N0G6N0T6N823b850k0G890k0B0B0w5Q6b5$017F6#7P0m7D3/8p5_7^8x7?7`4;137}7 0J0l0l838d870k8g8b0L8J8g8i8k8t1@8v6Q6S8s7,5g1R8V65698%67666a5;7G8!0?4$046k6{5E8/360{7e0m1~7~5#[email protected];0R4)8^5G0C8{1N8~5M2!5F9f5U040d0d974v556+6D5{3x9h4n9j9M9x8n8;7I7K7+9w8_0P0X0{8r3u069k9f9Q0%9S9D3X9W0{7%6T3E0o4X0m2w2X9@4H1v4J2z2C2x9a1N2w4I0}0o0$0(0*0z04.
Astuce Python : savoir si un élément est présent dans une liste

La fonction in de python fait cela :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

Activité 3 - Algorithme de recherche de maximum

On cherche à coder une fonction recherche_max qui prend en paramètre une liste tab et qui renvoie le plus grand élément de cette liste. L'usage de la fonction max est interdit.

Utilisation :

>>> recherche_max([4, 3, 8, 1])
8

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

Indices
Code à trous ⭐ ⭐ ⭐ ⭐
def recherche_max(tab):
    '''renvoie le maximum de la liste tab'''
Code à trous ⭐ ⭐ ⭐
def recherche_max(tab):
    '''renvoie le maximum de la liste tab'''
    ... = ...                
    for ... in ...:
        if ... > ...:
            ... = ...
    return ...
Code à trous ⭐ ⭐
def recherche_max(tab):
    '''renvoie le maximum de la liste tab'''
    maxi = ...           
    for elt in ...:
        if ... > ...:
            ... = ...
    return ...
Code à trous ⭐
def recherche_max(tab):
    '''renvoie le maximum de la liste tab'''
    maxi = tab[0]           
    for elt in tab:
        if ... > ...:
            maxi = ...
    return ...
Activité 4 - Algorithme de calcul de moyenne

On cherche à coder une fonction moyenne qui prend en paramètre une liste tab et qui renvoie la moyenne des éléments de cette liste.

Utilisation :

>>> moyenne([4, 3, 8, 1])
4.0
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

Indices
Code à trous ⭐ ⭐ ⭐ ⭐
def moyenne(tab):
    ''' renvoie la moyenne de tab'''
Code à trous ⭐ ⭐ ⭐
def moyenne(tab):
    ''' renvoie la moyenne de tab'''
    ... = ...
    for ... in ...:
        ... += ...
    return ... / ...
Code à trous ⭐ ⭐
def moyenne(tab):
    ''' renvoie la moyenne de tab'''
    somme = 0
    for elt in ...:
        ... += ...
    return ... / ...
Code à trous ⭐
def moyenne(tab):
    ''' renvoie la moyenne de tab'''
    somme = 0
    for elt in tab:
        somme += ...
    return ... / ...
Activité 5 - Algorithme de recherche d'occurrence

On cherche à coder une fonction recherche_occurrence qui prend en paramètre un élément elt et une liste tab et qui renvoie la liste (éventuellement vide) des indices de elt dans tab.

Utilisation :

>>> recherche_occurrence(3, [1, 6, 3, 8, 3, 2])
[2, 4]
>>> recherche_occurrence(7, [1, 6, 3, 8, 3, 2])
[]
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

Indices
Code à trous ⭐ ⭐ ⭐ ⭐
def recherche_occurrence(elt, tab):
    ''' renvoie la liste (éventuellement vide)
    des indices de elt dans tab'''
Code à trous ⭐ ⭐ ⭐
def recherche_occurrence(elt, tab):
    ''' renvoie la liste (éventuellement vide)
    des indices de elt dans tab'''
    ... = ...
    for ... in range(...):
        if ... == ...:
            ...
    return ...
Code à trous ⭐ ⭐
def recherche_occurrence(elt, tab):
    ''' renvoie la liste (éventuellement vide)
    des indices de elt dans tab'''
    liste_indices = ...
    for i in range(...):
        if ... == ...:
            ....append(i)
    return ...
Code à trous ⭐
def recherche_occurrence(elt, tab):
    ''' renvoie la liste (éventuellement vide)
    des indices de elt dans tab'''
    liste_indices = []
    for i in range(len(tab)):
        if tab[i] == ...:
            ....append(i)
    return ...
Activité 6 - Algorithme de recherche de maximum avec indice

On cherche à coder une fonction recherche_max_et_indice qui prend en paramètre une liste tab et qui renvoie le plus grand élément de cette liste ainsi que l'indice de ce maximum dans la liste (si il est présent plusieurs fois, un seul indice sera renvoyé). L'usage de la fonction max est interdit.

Utilisation :

>>> recherche_max_et_indice([4, 1, 3, 8, 3, 8, 1])
8, 5
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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

Astuce Python : fonctions min(), max() et sum()

Les fonctions min et `max permettent de déterminer directement minimums et maximum d'une liste, la fonction sum d'en calculer la somme :

>>> print(min([23,2,45]))
2
>>> print(max([23,2,45]))
45
>>> print(sum([23,2,45]))
70
>>> liste = [23,2,45]
>>> moy=sum(liste)/len(liste)
>>> print(moy)
23.333333333333332

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

Complexité/Coût linéaire d'un parcours séquentiel

On note \(n\) la taille des données en entrée. Dans notre cas, la mesure de cette taille correspond à la taille de la liste n=len(tab).

Le coût/complexité \(C(n)\) de ces algorithmes de recherche ou calculs séquentiels correspond au nombre d'opérations réalisées. Dans chacun des cas ci-dessus, cela correspond au nombre nombre d'itérations \(C(n)\) dans la boucle for de cet algorithme.

La complexité/coût de l'algorithme de recherche de minimum est linéaire, on le note \(O(n)\):

\(C(n) = O(n)\)