Vous êtes sur la page 1sur 5

Chapitre 6 : algorithmes avancés

Chapitre 6 : algorithmes plus avancés


1 Recherche dichotomique dans un tableau trié
1.1 Première approche : algorithme de recherche simple
trouvé ← faux
indice ← 0
Tant que trouvé ……………….….. et ………………..… :
Si monTableau[indice] ……….. item_Recherché :
trouvé ← …………..
sinon :
…………… ← ………..
finDuSi
fin Du Tant que

Exemple : montableau=[5,7,12,14,23,27,35,40,41,45]
Nombre d’itérations :
 pour item_Recherché = 35 : ……………………………………………
 dans le meilleur des cas (item_Recherché = … ) : ……………………………………………
 dans le pire des cas : …………………………………………… ……………………………………
complexité de l’algorithme : ………………………………

1.2 Algorithme de recherche dichotomique


Le principe est de définir le milieu du tableau (variable " milieu_Zone_Recherche ") puis de couper le
tableau en 2. On obtient 2 tableaux. On garde uniquement le tableau qui peut contenir la valeur
recherchée.

On recommence le processus jusqu'au moment où l'on "tombe" sur la valeur recherchée ou que l'on
se retrouve avec un tableau contenant un seul élément : si l'élément unique du tableau n'est pas
l'élément recherché, l’item n’est pas dans le tableau.

trouver ← False
milieu_Zone_Recherche←0
fin_Zone_Recherche ← dernier indice du tableau
debut_Zone_Recherche ← premier indice du tableau
tant que trouver ………………………………. Et 1début_Zone_Recherche………….fin_Zone_Recherche :
milieu_Zone_Recherche ← ………………………………………………………………
si montableau [milieu_Zone_Recherche]………………… :
trouver ←……………….
Sinon :
Si x>montableau[milieu_Zone_Recherche] :
1ébut_Zone_Recherche ←……………………………………………..
sinon :
fin_Zone_Recherche ←………………………………………
finDuSi
finDuSi
finDuTantQue
 Principe de l’algorithme pour x= 35 et montableau=[5,7,12,14,23,27,35,40,41,45]

1
Chapitre 6 : algorithmes avancés

Nombre d’itérations pour montableau=[5,7,12,14,23,27,35,40,41,45] :


 pour item_Recherché = 35 : ……………………………………………
 dans le meilleur des cas (item_Recherché = … ) : ……………………………………………
 dans le pire des cas : …………………………………………… ……………………………………

1.3 Complexité
Combien doit-on effectuer d'itérations pour un tableau de taille n dans le cas le plus défavorable ?
Sachant qu'à chaque itération de la boucle on divise le tableau comportant n items en 2, cela revient
donc à se demander combien de fois il faut diviser le tableau en 2 pour obtenir, à la fin, un tableau
comportant un seul entier ? Autrement dit, combien de fois faut-il diviser n par 2 pour obtenir 1 ?
Mathématiquement cela se traduit par l'équation :
…………………..
… avec a le nombre de fois qu'il faut diviser n par 2 pour obtenir 1. Il faut donc trouver a !
A ce stade il est nécessaire d'introduire une nouvelle notion mathématique : le "logarithme base 2"
noté log Par définition log (2 ) = 𝑎

Nous avons donc : = 1 𝑠𝑜𝑖𝑡 𝑛 = 2 𝑠𝑜𝑖𝑡 log (𝑛) = log (2 ) 𝑠𝑜𝑖𝑡


𝐥𝐨𝐠 𝟐 (𝒏) = 𝒂

Nous pouvons donc dire que la complexité en temps dans le pire des cas de l'algorithme de
recherche dichotomique est 𝐎( 𝐥𝐨𝐠 𝟐 (𝒏))

Application : En considérant un ordinateur capable de réaliser une itération de boucle tous les 0,1 ms
, quelle serait la durée de recherche pour les tableaux suivants (trouver la touche 𝐥𝐨𝐠 𝒃 (𝒏) sur votre
calculatrice).

Nombre d’items 1 32 1024 32 768 1 048 576


2
Chapitre 6 : algorithmes avancés

Durée de recherche simple


(en seconde)
Durée de recherche
dichotomique dans un
tableau trié

1.4 Terminaison
 Rappel : Un « variant de boucle » est une grandeur/nombre qui varie à chaque itération
 « Variant de boucle » de l’algorithme de recherche dichotomique :………………
 …………………

1.5 TP : Implémentation
Exercice 1 :

 Implémenter en python l’algorithme de recherche simple puis l’algorithme de recherche


dichotomique en suivant OBLIGATOIREMENT l’algorithme fourni dans ce cours.

Exercice 2

 Implémenter un générateur de très (très) grand tableau d’entiers et trier-le avec la méthode
de votre choix (tri par insertion par exemple).
 Effecteur ensuite une recherche simple et une dichotomique sur un item. Comparer les
temps d’exécution et afficher le nombre d’itérations.

Appeler le professeur pour validation.

Exercice 3 : l’ordinateur télépathe

Pensez à un nombre (pour éviter la triche écrivez-le sur une feuille retournée …). L’ordinateur
doit deviner ce nombre mystère. A chaque tour, l’ordinateur propose un nombre et l’humain
indique si le nombre mystère est plus petit ou plus grand que le nombre proposé. Si le nombre
mystère est 5 par exemple, une partie pourra se dérouler ainsi :
Devine le nombre !
Ordinateur : 8
Vous : plus petit
4
plus grand
6
plus petit
humain, tu penses au nombre 5

● Ecrire un programme permettant de jouer à devine le nombre, avec un nombre à


chercher compris par exemple entre zéro et cent. Prévoir le cas où l’humain triche.
● Déterminer combien il faut d’essais dans le pire des cas si l’on joue de façon optimale.
Appeler le professeur pour validation.

3
Chapitre 6 : algorithmes avancés

2 Algorithmes gloutons
2.1 Le problème du « rendu de monnaie »
Le système monétaire d'un pays comprend uniquement des pièces de 1€, 2€ et 3€. Vous devez
programmez une machine qui doit rendre la monnaie avec ces pièces.

La machine doit rendre le moins de pièces possible pour une somme donnée.

Il existe 2 stratégies notamment pour résoudre le problème :

 la première stratégie est appelée « force brute » : elle consiste ………………………………


…………………… …………………………………………………………………………………………………………………………
 La 2e stratégie est appelée « …………………………………………» :

« force brute » Stratégie « gloutonne »


avantages

Inconvénients

2.2 Problème du « rendu de monnaie », solution expérimentale par la « force brute »


Exercice 1

On souhaite connaitre la solution optimale pour rendre la somme de 6 € avec notre système.
Implémenter un algorithme qui affiche toutes les combinaisons possibles de pièces de de 1€, 2€ et
3€ donnant une somme comprise entre 0 et 6 €.
Si pour une combinaison la somme n’est pas égale à 6 € le programme affiche :

La combinaison 0 x 1 + 1 x 3 + 1 x 4 ne fonctionne pas

Si pour une combinaison la somme est égale à 6 € le programme affiche :

2 x 1 + 0 x 3 + 1 x 4 = 6 ; nombre pièces rendues : 3

Note : il est préférable de stocker les données dans des tuples.


Exercice 2

Le programme précédent doit maintenant pour finir afficher la combinaison optimale et le nombre
d’itérations effectuées pour tester toutes les combinaisons.

Appeler le professeur pour validation.

Exercice 3

Le programme précédent doit maintenant fonctionner pour n’importe quelle somme.

Rappel : la division entière en python s’écrit : //, par exemple 6//5 = 1.

Appeler le professeur pour validation.


4
Chapitre 6 : algorithmes avancés

2.3 Problème du « rendu de monnaie », solution expérimentale « gloutonne »


Exercice 4

 Implémenter l’algorithme glouton de rendu de monnaie donné dans le cours. Le programme


doit fonctionner pour n’importe quelle somme et afficher le nombre d’itérations.

Rappel l’instruction python % donne le reste d’une division

 Comparer la durée d’exécution pour des petites et des (très) grandes sommes des deux
stratégies.
 Déterminer (au moins) 2 cas où la stratégie gloutonne ne donne PAS la solution optimale.

Appeler le professeur pour validation.

2.4 Problème du « sac à dos »


Un vendeur pour un vide-greniers possède un sac à dos d'une contenance maximum de 30 Kg. il a la
possibilité d’emporter pour les vendre 4 objets A, B, C et D. Voici un tableau qui résume les
caractéristiques de ces objets :

D
A B C
objet Lampe
chandelier Arbre à chats Table de nuit
en fonte
masse 13 Kg 12 Kg 8 Kg 10 Kg

valeur marchande 700 € 400 € 300 € 300 €

Déterminez les objets que le vendeur à intérêt à emporter, sachant que :


 tous les objets devront tenir dans le sac à dos (30 Kg maxi)
 le vendeur cherche à obtenir un gain maximum.

Exercice 5

1. Proposer quelques solutions


2. Proposer une solution gloutonne pour répondre au problème
3. Implémenter cette solution en python
4. (bonus) implémenter une solution « force brute en python » et déterminer si la solution est
optimale

Vous aimerez peut-être aussi