Vous êtes sur la page 1sur 5

CTU Besançon – Année 2022-2023

Évaluation de programme
Devoir Maison

Avril 2023

Les exercices sont indépendants et peuvent être traités dans l’ordre de votre choix.

1 Calculabilité
Dans cet exercice, on ne demande pas de démonstration, juste de donner un argument.

Question 1. Soient L1 et L2 deux problèmes indécidables. Est-ce que L1 ∩ L2 peut


être décidable ? Pourquoi ?
Prenons l’exemple de L1 et L2 indécidables et completement disjoints. Dès lors,
L1 ∩ L2 = ∅ et par définition ∅ est décidable (trivial). Ainsi, L1 ∩ L2 peut être décidable.

Question 2. Est-ce que un problème NP-complet peut être indécidable ? Pourquoi ?


un problème est dans la classe NP si il existe une machine de Turing non-deterministe
en temps polynomial qui décide ses instances. Donc tout problème NP est par définition
décidable. Les problèmes NP-complets sont "en quelque sorte" les plus compliqués de la
classe NP, donc tout problème NP-Complete est forcément décidable. (voir cours)

Question 3. Soient L1 et L2 deux problèmes décidables. Est-ce que L1 ∩ L2 peut être


indécidable ? Pourquoi ?
Par définition, si L1 et L2 sont deux problèmes décidables, alors leur union et
intersection sont décidables. Donc L1 ∩ L2 ne peut pas être indécidable.

1/5
Comme L1 est décidable, il existe une machine de Turing M1 , qui décide l’ensemble
des mots de L1 . Comme L2 est décidable, il existe une machine de Turing M2 , qui décide
l’ensemble des mots de L2 .
Pour cela, on peut imaginer une machine de Turing M, qui combine M1 et M2 sur
deux rubans différents. M s’arretant forcément dès que M1 et M2 s’arretent. Une telle
machine M, reconnaît alors a la fois les mots communs de L1 et de L2 .

2 Chèques et factures.
Un employé de France Télécom dispose d’une pile de n factures de téléphone et
d’une pile de p chèques destinés à payer les factures, chaque chèque et chaque facture
portant le numéro de téléphone correspondant. Il a peut-être moins de chèques que de
factures (p ≤ n) et il veut savoir quelles factures n’ont pas été payées. Il envisage trois
algorithmes :
1. Prendre les chèques dans l’ordre où ils se présentent. Pour chacun d’entre eux,
parcourir la pile de factures pour chercher la facture qui lui correspond. Si on l’a
trouvé, enlever le chèque et la facture de leurs listes respectives.
2. Trier les factures par ordre de numéro de téléphone croissant. Pour chaque chèque,
faire une recherche dichotomique de la facture correspondante.
3. Trier les chèques par ordre de numéro de téléphone croissant. Pour chaque facture,
faire une recherche dichotomique du chèque correspondant.
Donner la complexité de chaque algorithme en nombre de comparaisons (où chaque
comparaison se fait entre les numéros de téléphones sur deux chèques, un chèque et une
facture, ou deux factures) et comparer (dire quel algorithme est le plus efficace et lequel
est le moins efficace).
1. Pour le premier algorithme, dans le pire des cas, on parcourt à chaque fois la
pile entière de factures. On fait alors n comparaisons pour le premier chèque,
n − 1 pour le deuxième etc... On fait au total np − p(p − 1)/2 comparaisons. La
complexité du premier algorithme est donc O(np).
2. Pour le deuxième algorithme on commence par trier les factures ce qui peut se faire
en O(n log n) si on utilise le tri par tas. Ensuite chaque recherche dichotomique
demande au plus O(log n) comparaisons. Donc l’ensemble des recherches dicho-
tomiques demande au plus O(p log n) comparaisons. La complexité du deuxième
algorithme est donc O(n log n).
3. Pour le troisième algorithme on commence par trier les chèques ce qui peut se faire
en O(p log p) si on utilise le tri par tas. Ensuite chaque recherche dichotomique
demande au plus O(log p) comparaisons. Donc l’ensemble des recherches dicho-
tomiques demande au plus O(n log p) comparaisons. La complexité du premier
algorithme est donc O(n log p).
Étant donné que p ≤ n, le meilleur algorithme est le troisième, suivi par le deuxième
et le moins efficace est le premier.

2/5
Si on utilise un tri moins efficace que le tri par tas, le deuxième algorithme a alors une
complexité de n2 et le troisième de p2 +O(n log p). Dans ce cas, le deuxième algorithme est
3p2 +p
le moins efficace, la première méthode est plus efficace que la troisième si n ≥ 2(p−log p) .

3 Algorithme du médian
On souhaite utiliser l’algorithme du médian, pour résoudre le problème du rang.
Comment peux t’on procéder ? Dérouler un exemple, pour un tableau de valeurs tab=
[6,12,5,8,3,14,2,10,4,1,7,13,11] et l’entier i = 9
On considère l’algorithme du médian vu en cours

si (n=1)
alors on retourne l’unique élément du tableau
sinon
1. on divise les n éléments du tableau en n/5 groupes de 5
éléments chacun et un éventuel dernier groupe constitué
des n mod 5 éléments restants.
2. on trouve le médian (grace à la fonction) de chaque groupe de la façon suivante:
on trie par insertion les éléments de chaque groupe et on
prend le médian de chaque groupe trié.
3. on rappelle l’algorithme sur le tableau constitué par
l’ensemble des médians trouvés lors de l’étape précédente
afin d’en trouver le médian. On nomme x cet élément.
4. on partitionne le tableau entier autour de x : à la fin
de la partition les éléments plus petits que x sont placés
avant lui dans le tableau, les éléments plus grands après.
On nomme k le nombre d’éléments plus petits.

Puis

5. si (i = k +1)
alors l’élément cherché est x.
finsi
si (i < k+1)
alors
on rappelle l’algorithme sur les éléments plus petits
afin de trouver l’élément de rang i
finsi
si (i > k+1)
alors
on rappelle l’algorithme sur les éléments plus grands
afin de trouver l’élément de rang i-k-1
finsi

3/5
finsi

Exemple :
(1) tab = [6,12,5,8,3,14,2,10,4,1,7,13,11] que l’on partitionne en deux groupes
de 5, et un groupe de 3 ; [6,12,5,8,3] [14,2,10,4,1] et [7,13,11]
(2) Pour chaque groupe que l’on trie ( [3,5,6,8,12] [1,2,4,10,14] et [7,11,13]) , on est
capable de récupérer un ensemble de médians [6, 4, 11],
(3) On rappelle l’algorithme sur le tableau constitué par l’ensemble des médians
trouvés [6, 4, 11] d’où on déduit x = 6.
(4) On partitionne le tableau d’entier autour de 6 : à la fin de la partition les éléments
plus petits que 6 sont placés avant lui dans le tableau, les éléments plus grands après, ce
qui donne [5,3,2,4,1,6,12,8,14,10,7,13,11], et k=5.
Comme 8 > 5 + 1, on rappelle l’algorithme sur les éléments plus grands afin de trouver
l’élément de rang 9-5-1 = 3
On recommence donc l’algorithme, avec tab= [12,8,14,10,7,13,11] et i = 3.
(1) tab= [12,8,14,10,7,13,11] que l’on partitionne comme cela : [12,8,14,10,7]
et [13,11]
(2) Pour chaque groupe que l’on trie, on récupére un ensemble de médians [10, 11]
d’où on déduit x = 10.
On partitionne le tableau d’entiers autour de 10 ce qui donne [7,8,10,11,12,13,14]
avec k=2
Comme 3 = 2 + 1, l’élément recherché est la valeur x=10.
En triant le tableau de départ, on aurait :
tab = [1, 2, 3,4, 5,6,7,8,10,11, 12,13,14] et l’élément de rang 9, vaut bien
10.

4 Tas
On considère le tas dont le tableau correspondant est tab=[2,3,8,5,7,12].
1. Indiquer le contenu du tableau tab obtenu en ajoutant la valeur 4 au tas. Justifier.
2. Supprimer ensuite le minimum de ce tas et indiquer le nouveau contenu du tableau
tab. Justifier.
L’état du tas initial est :
2

3 8

5 7 12
On remarque que la relation d’ordre utilisée considère que que chaque racine est au
moins inférieure aux racines des ses sous-arbres.
L’insertion de la valeur 4 donne :

4/5
2 → 2

3 8 3 4

5 7 12 4 5 7 12 8
Pour conserver la propriété des tas, il y a eu une permutation entre l’élément 4 et 8.
Le tableau est donc tab=[2,3,4,5,7,12,8].
La suppression du minimum se fait de la façon suivante :
On supprime la racine (2), que l’on remplace par l’élément le plus en bas à droite (8).
8

3 4

5 7 12
Puis on applique des règles de transformation pour conserver les propriétés du tas.
3 → 3

8 4 5 4

5 7 12 8 7 12
Le tableau est donc tab=[3,5,4,8,7,12].

5/5

Vous aimerez peut-être aussi