Information, calcul et communication EPFL - GC+SIE - Semestre d’automne 2016-2017
Module 1, Série 3 : Exercices sur les algorithmes (II)
1 Création d’algorithmes
a) Supposons que votre ordinateur utilise une représentation des nombres entiers positifs sur 64 bits. Ecrivez
un algorithme en pseudo-code dont l’entrée est net dont la sortie est le logarithme en base 2 de n![Pour rappel,
n!se dit “factorielle de n” et vaut n! = n·(n1) ·(n2) · · · 3·2·1] Quel est l’ordre de complexité de votre
algorithme ? (utiliser la notation de Landau O(·))
[Note : Si vous choisissez la solution qui peut paraître la plus simple a priori, vous serez confronté au problème
suivant : n!grandit très vite avec net dépasse déjà la valeur limite de votre ordinateur (264 1) lorsque n= 21.
Or on aimerait calculer log2(n!) pour de plus grandes valeurs de n. Comment allez-vous vous y prendre pour
obtenir une réponse qui ne donne pas un overflow ?]
b) Ecrivez une version récursive du précédent algorithme. L’ordre de complexité de votre algorithme change-t-il ?
c) Soit Aune chaîne de caractères formée uniquement de mots et d’espaces entre les mots, et nsa longueur
(exemple : A=“Le silence des agneaux” et donc n= 22). Ecrivez un algorithme dont l’entrée est Aet n, et dont la
sortie est le nombre de mots de la chaîne (4 dans l’exemple). Quel est l’ordre de complexité de votre algorithme ?
d) Soit Lune liste de nombres entiers positifs de taille n(exemple : L={3,43,17,22,16}et donc n= 5).
Ecrivez un algorithme dont l’entrée est Let n, et dont la sortie est le plus grand nombre de la liste (dans
l’exemple : 43). Quel est l’ordre de complexité de votre algorithme ?
e) Soit Lune liste de nombres entiers positifs de taille n(exemple : L={3,43,17,22,16}et donc n= 5).
Ecrivez un algorithme dont l’entrée est Let n, et dont la sortie est le produit des deux plus grands nombres de
la liste (dans l’exemple : 43 ×22 = 946). Quel est l’ordre de complexité de votre algorithme ?
2 Quel est le bon algorithme ? deuxième partie
Lequel des quatre algorithmes suivants permet de calculer la somme des npremiers nombres pairs ? (exemple :
si n= 4, alors sdoit valoir 2 + 4 + 6 + 8 = 20) Expliquez également pourquoi les autres ne fonctionnent pas.
a) algo1
entrée : n nombre entier positif
sortie : s
Si n= 0
Sortir : 0
Sortir : algo1(n2) + n
b) algo2
entrée : n nombre entier positif
sortie : s
Si n= 0
Sortir : 0
Sortir : 2×(algo2(n1) + n)
c) algo3
entrée : n nombre entier positif
sortie : s
Si n= 0
Sortir : 0
Sortir : algo3(n1) + 2n
d) algo4
entrée : n nombre entier positif
sortie : s
Si n= 0
Sortir : 0
Sortir : algo4(2n2) + 2n
1
3 Au temps des Egyptiens, deuxième partie
Proposez une version récursive de l’algorithme vu à l’exercice 3 de la série 1.2 :
devinette
entrée : a,bdeux entiers naturels non nuls
sortie : a×b
xa
yb
z0
Tant que y1
Si yest pair
x2x
yy/2
Sinon
zz+x
yy1
sortir : z
4 Au temps des Grecs
Proposez une version récursive de l’algorithme d’Euclide, qui calcule le plus grand diviseur commun de deux
entiers naturels aet b:
Algorithme d’Euclide
entrée : a,bdeux entiers naturels non nuls
sortie : pgcd(a,b)
r0
Tant que b > 0
ramod b
ab
br
sortir : a
[Note : Comme vu précédemment, amod bdésigne le reste de la division euclidienne de apar b]
2
Pour le fun (mais pas uniquement. . .)
5 Des chevaliers et des espions
Vous faites face à une assemblée de chevaliers et d’espions, mais vous ne savez pas qui sont les chevaliers, qui
sont les espions. Les chevaliers disent toujours la vérité, les espions mentent toujours. Votre but est d’identifier
au moins une personne de confiance dans l’assemblée, que vous pouvez affirmer être un chevalier. Pour cela,
vous pouvez poser des questions du type :
(à la personne A) “Est-ce que la personne B est un chevalier ou un espion ?”
Heureusement pour vous, on suppose qu’il y a toujours légèrement plus de chevaliers que d’espions dans l’assem-
blée, de telle manière que si vous choisissiez une personne au hasard dans l’assemblée sans poser de questions,
vos chances de tomber sur un chevalier seraient de plus de 50%.
De combien de questions au plus aurez-vous besoin pour identifier un chevalier à coup sûr et quelle sera la
meilleure stratégie (i.e., le meilleur algorithme) à adopter dans les situations suivantes :
a) L’assemblée est composée de 3 personnes, incluant au plus 1 espion.
b) L’assemblée est composée de 5 personnes, incluant au plus 2 espions.
c) L’assemblée est composée de 7 personnes, incluant au plus 3 espions.
d*) Cas général (difficile !) : l’assemblée est composée de Npersonnes (avec Nimpair), incluant au plus N1
2
espions. Dans ce cas, il vous faudra penser à un algorithme récursif !
Indication pour commencer l’exercice : Réfléchir à ce qu’implique le fait que la personne A réponde
“La personne B est un chevalier. ou au contraire “La personne B est un espion.
Complément : Vous pouvez pimenter l’exercice en supposant que les espions ne mentent pas de manière systé-
matique, mais répondent comme bon leur semble.
3
6 Taille de liste
Soit Lune liste d’entiers (pas forcément ordonnée et avec de possibles répétitions), comme par exemple
{19,31,15,21}.
On cherche ici à écrire un algorithme taille(L)qui retourne le nombre d’éléments d’une liste Ldonnée en entrée.
On suppose que l’on dispose d’un autre algorithme a_element(L, i)qui nous dit (vrai ou faux) s’il existe un
ieélément dans la liste : il répond donc “ vrai ” si iest inférieur ou égal à la taille de la liste et “ faux ” sinon. 1
1. Comment utiliser l’algorithme a_element(L, i)pour calculer la taille de Len un temps linéaire (par
rapport à cette taille) ?
Ecrivez un algorithme pour le faire.
2. En vous inspirant de la recherche dichotomique (cf. cours), pourrait-on avoir une complexité moindre
que linéaire ?
Si oui, quelle serait cette complexité et expliquez intuitivement comment procéder.
Pour les plus motivés : essayez d’écrire un tel algorithme.
1. Notez qu’il n’est pas évident de toujours avoir un tel algorithme (sans avoir taille, bien sûr !). En realité, cela dépend de la
représentation effective de L. Mais nous faisons ici l’hypothèse qu’un tel algorithme existe pour L.
4
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!