Algorithmes de première

  • Accueil
  • Tri
    • Tri par insertion
    • Tri par séléction
  • Recherche
    • Recherche du minimum et du maximum
    • Recherche dichotomique
  • Algorithme glouton

Recap algo

Tri par insertion¶

l'Algorithme¶

VARIABLE
t : tableau d'entiers
i : nombre entier
j : nombre entier
k : nombre entier

DEBUT
j=2
tant que j<=longueur(t): //boucle 1
i=j-1
k=t[j]

tant que i>0 et que t[i]>k:   //boucle 2  
    t[i+1]=t[i]  
    i=i-1  
fin tant que  

t[i+1]=k  
j=j+1  

fin tant que

FIN

Le python¶

def tri_insertion(list):
    n = len(list)

    for i in range(1, n):
        # Stocker la valeur courante pour insertion ultérieure
        cle = list[i]
        j = i - 1
        # Déplacer les éléments de la liste triée vers la droite
        # jusqu'à ce qu'une position appropriée pour la valeur_courante soit trouvée
        while j >= 0 and cle < list[j]:
            list[j + 1] = list[j]
            j -= 1

        # Insérer la valeur_courante à sa position correcte
        list[j + 1] = cle

# Exemple d'utilisation avec le  liste (merci gabrielle) t
t = [4,1,3,5,2]
print(" liste (merci gabrielle) non trié :", t)

tri_insertion(t)

print(" liste (merci gabrielle) trié :", t)

Les exercices¶

Exercice 1 1. Adapter le tri par insertion vu en cours pour trier le tableau de tuples suivants en fonction du second élément des tuples:

tab = [(5, "a"), (8, "b"), (1, "e"), (5, "d"), (7, "f"), (8, "c")]

Exercice 7

  1. Construire par compréhension un tableau de cent éléments aléatoires compris entre 0 et 10.
  2. En s’aidant du tri par insertion, écrire la fonction max_occurrences(tab: list) → int qui renvoie l’élément le plus présent dans le tableau. Indication: dans un tableau trié les éléments identiques se suivent.

tri par selection¶

l'Algorithme¶

VARIABLE
t : tableau d'entiers
i : nombre entier
min : nombre entier
j : nombre entier

DEBUT
i=1
tant que i<longueur(t): //boucle 1
j=i+1
min=i

tant que j<=longueur(t):   //boucle 2  
    si t[j]<t[min]:  
        min=j  
    fin si  
    j=j+1  
fin tant que  

si min≠i :  
    échanger t[i] et t[min]  
fin si  
i=i+1  

fin tant que

FIN

L'implémentation python¶

def tri_selection(tab):
    n = len(tab)

    for i in range(n - 1):
        # Trouver l'indice du minimum non trié
        indice_min = i
        for j in range(i + 1, n):
            if tab[j] < tab[indice_min]:
                indice_min = j

        # Échanger l'élément minimum avec le premier élément non trié
        tab[i], tab[indice_min] = tab[indice_min], tab[i]
        print(tab)

# Exemple d'utilisation avec le tableau t
t = [15, 16, 11, 13, 12]
print("Tableau non trié :", t)

tri_selection(t)

print("Tableau trié :", t)

Exercices epreuve pratiques¶

sujets ici

Theme Sujet 2024 Exercice n°
Tri 25/30 2
Tri 37 2
Tri insertion 7/12 2
Tri selection 12 1

Recherche du max et min dans une liste¶

l'Algorithme¶

VARIABLE
L=[1,3,5,-4,7]
DEBUT
min <- le premier element de la liste L
max <- le premier element de la liste L

Pour chaque élément de la liste faire  
    si élement est inférieur à min  
        min <- element  
    si élément est supérieur à max  
        max <- element  
afficher min max  

FIN

L'implémentation python¶

L=[1,3,5,-4,7]
min=L[0]
max=L[0]

for elt in L:
    if elt<min:
        min=elt
    elif elt>max:
        max=elt

print("Le min est {} et le max est {}".format(min,max))

print(f"Le min est ${min} et le max est ${max}")

Exercices epreuve pratiques¶

sujets ici

Theme Sujet 2024 Exercice n°
Recherche min /max 14/26/35 1
Recherche max 28 2
Recherche max 5/38 1
Recherche element 2/4/6/13/17/20/34/43/39 1

Recherche dichotomique¶

VARIABLE
t : tableau d'entiers trié
x : entier (valeur à chercher)
début : entier
fin : entier
milieu : entier
trouvé : booléen

DEBUT
début = 0
fin = longueur(t) - 1
trouvé = faux

tant que début <= fin et non trouvé: // boucle
milieu = (début + fin) / 2

si t[milieu] = x:  
    trouvé = vrai  
sinon si t[milieu] < x:  
    début = milieu + 1  
sinon:  
    fin = milieu - 1  
fin si  

fin tant que

si trouvé:
afficher "Élément trouvé à l'index", milieu
sinon:
afficher "Élément non trouvé"
fin si

FIN

L'implémentation python¶

def recherche_dichotomique(t, x):
    debut = 0
    fin = len(t) - 1
    trouve = False

    while debut <= fin and not trouve:
        milieu = (debut + fin) // 2
        
        if t[milieu] == x:
            trouve = True
        elif t[milieu] < x:
            debut = milieu + 1
        else:
            fin = milieu - 1
    
    if trouve:
        print(f"Élément trouvé à l'index {milieu}")
    else:
        print("Élément non trouvé")

# Exemple d'utilisation
t = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
x = 7
recherche_dichotomique(t, x)

Exercices epreuve pratiques¶

sujets ici

Theme Sujet 2024 Exercice n°
Recherche dichotomique 12/25/31/42 2

K plus proches voisins¶

VARIABLE t : tableau de points (chaque point ayant des coordonnées dans un espace à d dimensions)
p : point (le point pour lequel on cherche les k plus proches voisins)
k : entier (le nombre de voisins à trouver)
distances : tableau de paires (distance, point)
i : entier
j : entier

DEBUT
distances = tableau vide

// Calculer la distance de chaque point du tableau à p
pour i de 1 à longueur(t):

distance = distance_entre(p, t[i])  
ajouter (distance, t[i]) à distances  

fin pour

// Trier le tableau des distances par distance croissante
trier distances par le premier élément de chaque paire (distance)

// Sélectionner les k premiers éléments du tableau trié
voisins_proches = sous-tableau de distances des indices 1 à k

afficher voisins_proches

FIN

FONCTION distance_entre(p1, p2)
somme = 0

pour j de 1 à longueur(p1):  
    
    somme = somme + (p1[j] - p2[j])^2  
fin pour  
retourner racine_carrée(somme)  

FIN FONCTION

L'implémentation python¶

import math

def distance_entre(p1, p2):
    return math.sqrt(sum((p1[i] - p2[i]) ** 2 for i in range(len(p1))))

def k_plus_proches_voisins(t, p, k):
    distances = []
    
    for point in t:
        distance = distance_entre(p, point)
        distances.append((distance, point))
    
    # Trier par distance
    distances.sort(key=lambda x: x[0])
    
    # Sélectionner les k premiers voisins
    voisins_proches = distances[:k]
    
    return voisins_proches

# Exemple d'utilisation
t = [(1, 2), (2, 3), (3, 4), (5, 5), (1, 1)]
p = (2, 2)
k = 3

voisins_proches = k_plus_proches_voisins(t, p, k)
print("Les k plus proches voisins sont :", voisins_proches)

algorithme glouton (le sac à dos / le rendu de monnaie)¶

VARIABLE
valeurs : tableau des valeurs des objets
poids : tableau des poids des objets
capacite : entier (capacité maximale du sac à dos)
n : entier (nombre d'objets)
ratio : tableau de paires (ratio, index)
poids_total : entier
valeur_totale : entier
i : entier

DEBUT
// Calculer le ratio valeur/poids pour chaque objet
pour i de 1 à n:
ratio[i] = (valeurs[i] / poids[i], i)
fin pour

// Trier les objets par leur ratio valeur/poids décroissant
trier ratio par le premier élément de chaque paire (ratio) en ordre décroissant

poids_total = 0
valeur_totale = 0

// Ajouter les objets au sac à dos jusqu'à atteindre la capacité maximale
pour i de 1 à n:

si poids_total + poids[ratio[i].index] <= capacite:  
    poids_total = poids_total + poids[ratio[i].index]  
    valeur_totale = valeur_totale + valeurs[ratio[i].index]  
fin si 

fin pour

afficher "Valeur totale dans le sac à dos:", valeur_totale

FIN

L'implémentation python¶

def knapsack_glouton(valeurs, poids, capacite):
    # Calculer le ratio valeur/poids pour chaque objet
    ratio = [(valeurs[i] / poids[i], i) for i in range(len(valeurs))]
    
    # Trier les objets par leur ratio valeur/poids décroissant
    ratio.sort(key=lambda x: x[0], reverse=True)
    
    poids_total = 0
    valeur_totale = 0
    
    # Ajouter les objets au sac à dos jusqu'à atteindre la capacité maximale
    for r, i in ratio:
        if poids_total + poids[i] <= capacite:
            poids_total += poids[i]
            valeur_totale += valeurs[i]
    
    return valeur_totale

# Exemple d'utilisation
valeurs = [60, 100, 120]
poids = [10, 20, 30]
capacite = 50

valeur_totale = knapsack_glouton(valeurs, poids, capacite)
print("Valeur totale dans le sac à dos:", valeur_totale)

Le rendu de monnaire (A connaitre)¶

Entrées :

montant : le montant à rendre
valeurs : une liste des valeurs des pièces et billets disponibles, triée par ordre décroissant
Sorties : Une liste des pièces et billets utilisés pour rendre le montant

DEBUT

fonction rendre_monnaie_glouton(montant, valeurs):
rendu = liste vide
pour chaque valeur dans valeurs:
tant que montant est supérieur ou égal à valeur:
ajouter valeur à rendu
montant = montant - valeur
si montant != 0:
afficher "Impossible de rendre le montant avec les valeurs disponibles"
retourner rendu

def rendu_monnaie_glouton(somme_a_rendre, pieces_disponibles):
    nombre_total_pieces = 0
    pieces_disponibles = sorted(pieces_disponibles, reverse=True)

    for piece in pieces_disponibles:
        while somme_a_rendre >= piece:
            somme_a_rendre -= piece
            nombre_total_pieces += 1

    return nombre_total_pieces

# Test avec une somme à rendre de 2,63 €
somme_test = 2.63
pieces_disponibles_test = [2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01]

resultat = rendu_monnaie_glouton(somme_test, pieces_disponibles_test)
print(f"Pour rendre {somme_test} €, le nombre minimal de pièces est : {resultat}")

Exercice bac epreuve pratique¶

On dispose d’un ensemble d’objets dont on connaît, pour chacun, la masse. On souhaite ranger l’ensemble de ces objets dans des boites identiques de telle manière que la somme des masses des objets contenus dans une boîte ne dépasse pas la capacitécde la boîte. On souhaite utiliser le moins de boîtes possibles pour ranger cet ensemble d’objets.

Pour résoudre ce problème, on utilisera un algorithme glouton consistant à placer chacun des objets dans la première boîte où cela est possible.

Par exemple, pour ranger dans des boîtes de capacitéc = 5un ensemble de trois objets dont les masses sont représentées en Python par la liste[1, 5, 2], on procède de la façon suivante :

  • Le premier objet, de masse 1, va dans une première boite.
  • Le deuxième objet, de masse 5, ne peut pas aller dans la même boite que le premier objet car cela dépasserait la capacité de la boite. On place donc cet objet dans une deuxième boîte.
  • Le troisième objet, de masse 2, va dans la première boîte.

On a donc utilisé deux boîtes de capacitéc = 5pour ranger les 3 objets.

Compléter la fonction Pythonempaqueter(liste_masses, c)suivante pour qu’elle renvoie le nombre de boîtes de capacité c nécessaires pour empaqueter un ensemble d’objets dont les masses sont contenues dans la listeliste_masses. On supposera que toutes les masses sont inférieures ou égales à c.

def empaqueter(liste_masses, c):

"""Renvoie le nombre minimal de boîtes nécessaires pour
empaqueter les objets de la liste liste_masses, sachant
que chaque boîte peut contenir au maximum c kilogrammes"""  
n = len(liste_masses)  
nb_boites = 0  
boites = [ 0 **for** _ **in** range(n) ]  
**for** masse **in** ...:  
    i = 0  
    **while** i < nb_boites **and** boites[i] + ... > c:
        i = i + 1  
        **if** i == nb_boites: 
            ...  
        boites[i] = ...
    *return** ...

Exemples :

empaqueter([1, 2, 3, 4, 5], 10)
2
empaqueter([1, 2, 3, 4, 5], 5)
4
empaqueter([7, 6, 3, 4, 8, 5, 9, 2], 11)
5

Designed by BootstrapMade