Вы находитесь на странице: 1из 68

university-logo

Problmes difciles
Algorithmique
Structures de donnes
Hugues Talbot
Dpartement A2SI
ESIEE
22/03/2005 / ISBS
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Plan
1
Problmes difciles
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Transparents trs fortement inspirs du cours de Jean-Jacques
Levy.
http://www.enseignement.polytechnique.fr/profs/informatique/Jean-
Jacques.Levy/
Sujet prsent de faon exhaustive par Donald E. Knuth
The Art of Computer Programming (1973).
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Concepts de structure de donnes
Acceder et manipuler des donnes efcacement
On apprend toujours aux tudiants bien structurer leurs
programmes leur code.
Grce la programmation oriente objet, on a plus
rcemment tendance associer code et donnes dans un
mme cadre.
En fait les questions de la manipulation, du stockage et de
laccs aux donnes dun problme doivent tre traits au
mme niveau que celui de lalgorithme lui-mme.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Changement de perspective
Programmation oriente donnes
Rechir aux contraintes du problme.
Proposer un algorithme
Gerer laccs et la manipulation de donnes
Rechir une structure qui rende la solution
Plus simple ;
Plus rapide ;
Moins gourmande en mmoire.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Exemple de problme
Indexer un chier
Entre: un chier de longueur inconnue
Sortie: une liste de tous les mots et de leur position(s)
dans le cher.
Le nombre de mots est inconnu
Il ny a pas de limite sur la frquence des mots.
Le chier est de longueur nie.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
TD: tenter une approche sur ce problme
Peut-on exhiber un algorithme pour rsoudre ce problme
(mme inefcace au dbut)
Quavons nous besoin de stocker ?
Quavons nous besoin de retrouver ?
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Exemple dalgorithme
En pseudo-Java
class IndexFile {
public static void main( String args [ ] ) {
int j = 0;
StringList wordlist;
IntList positionlist;
String word [ ] ;
while ( word ! = EOF) {
word= readNextWord( file ) ;
if ( word ! = EOF) { // end-of-file
j++;
if ( ( positionlist = wordlist. lookup( word) ) == nil)
positionlist = wordlist. insert( word ) ;
}
positionlist. append( j ) ;
}
}
printIndex ( ) ;
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Exemple dalgorithme dindexage - 2
class IndexFile {
void printIndex( ) {
foreach word in wordlist {
System. out. println( word ) ;
positionlist = wordlist. lookup( word)
foreach i in positionlist {
System. out. println( i ) ;
}
}
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
De quoi avons nous eu besoin ?
Pour manipuler nos donnes
Daccumuler des chanes de caractres indniment
(append) ;
Dinsrer des chanes de caractres dans une liste (insert)
;
De faire des recherches de chanes (lookup) ;
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Ameliorer les tableaux
Les vecteurs
Attention: terminologie C++ : vector
Croissent et dcroissent volont ;
Insertion, recherche lente ;
Opration de pile larrire (LIFO);
Accs alatoire optimal.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Une autre option
Les queues
C++: deque (buffer circulaire)
Mme oprations que les vecteurs ;
En plus accs pile lavant (FIFO) ;
Accs alatoire rapide.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Les listes chanes
Insertion et suppression
Mme oprations que les vecteurs sauf accs alatoire ;
Insertion et suprression rapides.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Implementation en Java
a voir
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Complexit des oprations
opration Accs alatoire Insertion/suppression Pile avant Pile arrire Iteration
tableau O(1) Aleat.
vecteur O(1) O(n)+ O(1)+ Aleat.
queue O(1) O(n) O(1) O(1) Aleat.
liste O(1) O(1) O(1) Bidir.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Types de donnes abstraits (ADT)
Pile (LIFO/PEPS)
File dattente (FIFO/PEDS)
File priorit (Priority Queue, tas)
Dictionnaires (map)
Ensembles
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Types de donnes spcialises
Arbres binaires
Tableau hash (Hashtable)
Skiplist
Etc...
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Pile Stack
Aussi appele PADS ou LIFO.
Restriction des oprations dune liste sa tte
On empile des donnes et on les dpile seulement.
Push() == insertion une extrmit
Pop() == extraction/suppression la mme extrmit.
Mise en oeuvre trs simplie, soit partir dune liste soit
partir dun vecteur (ou mme un tableau).
Q: quelle extrmit doit on utiliser si on se base sur un vecteur?
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Exemple dappliation : la calculatrice
Soit lexpression 5 * (((9+8) * (4 * 6)) + 7)
On empile les nombres
On dpile lorsquune parenthse se ferme et on execute
lopration
On empile le rsulat.
Lorsque la pile ne contient plus quun seul lment cest la
solution.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Solution possible
class ManualCalc {
void compute( ) {
push( 5 ) ;
push( 9 ) ;
push( 8 ) ;
push( pop( ) +pop ( ) ) ;
push( 4 ) ;
push( 6 ) ;
push( pop( ) pop ( ) ) ;
push( pop( ) pop ( ) ) ;
push( 7 ) ;
push( pop( ) + pop ( ) ) ;
push( pop( ) pop ( ) ) ;
System. out. print( pop ( ) ) ;
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Notation polonaise inverse
La faon standard dcrire les expressions est dite
"inxe".
On peut recrire toute expression inxe en une notation
telle que les oprandes apparaissent dabord et les
operateurs aprs: exemple:
5 9 8 + 4 6 * * 7 + *.
Notation dite "postxe" ou Polonaise inverse, popularise
par les calculateurs HP.
Conversion inxe / postxe facile, avec une pile
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Conversion de notation
class InfixtoPostfix {
void convert( File input) {
char c;
for ( stackinit( ) ; read( input, c) ! = EOF ; ) {
if ( c == )) System. out. print( pop ( ) ) ;
if ( c == +) push( c ) ;
if ( c == *) push( c ) ;
while ( c >= 0 && c <= 9) {
System. out. print( c ) ;
read( input, c ) ;
}
if ( c ! = () System. out. print( " " ) ;
}
System. out. println( "" ) ;
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Intrt de la conversion en postx
La notation postxe na pas besoin de parenthse et nest
pourtant pas ambigue: exemples:
((5*9)+8)*((4*6)+7)
(5*((9+8)*(4*6))+7)
Evaluation de lexpression postxe est trs facile.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Evaluation de la notation postxe
Encore laide dune pile !
class EvaluatePostfix {
void evaluate( File input) {
char c ; int x;
for ( stackinit( ) ; read( input, c) ! = EOF ; ) {
x = 0;
if ( c == +) x = pop( ) + pop ( ) ;
if ( c == *) x = pop( ) pop ( ) ;
while ( c >= 0 && c <= 9) {
x = 10 x + ( c0)
read( input, c ) ;
}
push( x ) ;
}
System. out. println( x ) ;
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Utilit des piles
Trs simple mettre en oeuvre et utiliser
Peuvent simplier beaucoup de problmes.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
File dattente Queue
Aussi appele PAPS ou FIFO.
Trs semblable la pile, mais on doit utiliser et la tte et la
queue de la structure.
On empile des donnes et on les dpile seulement.
Put() == insertion une extrmit
Get() == extraction/suppression lautre extrmit.
Mise en oeuvre trs simplie, soit partir dune liste soit
partir dun vecteur (ou mme un tableau).
Q: comment faire si on se base sur un vecteur?
Hugues Talbot Algorithmique
university-logo
Problmes difciles
File deux extrmits deque
Combinaison dune pile et dune le dattente.
On peut insrer et supprimer/extraire aux deux extrmites:
push_front();
pop_front();
push_back();
pop_back();
Pas beaucoup plus cher mettre en oeuvre quune le
dattente
Plus exible.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Type de donnes abstraits ADT
On ne soccupe pas de dtails de la mise en oeuvre
Sparation du "concept" et de la fonctionnalit
Moyen dorganiser la programmation grande chelle
Tous les langages rcents proposent une mise en oeuvre
des ADT prte lemploi : Java, C#, C++, Perl, Python,
etc. Ce nest pas le cas de C !
Extrmement important de savoir utiliser ces structures
pour programmer efcacement.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Dnition
Sous ensemble des graphes
Terminologie des graphes: sommets, artes.
Terminologie des arbres: noeuds, racine, chemins,
(grand-)parent, enfants, feuilles / sommets terminaux,
branches/sommets internes, sous-arbre, niveaux, hauteur,
longueur de chemin.
Un arbre peut-tre ordonn ou non.
Dans un arbre chaque sommet peut avoir soit un nombre
quelconque de descendants, soit un nombre
pr-determin, exemple: arbres binaires.
Un arbre binaire peut tre vide, rempli ou complet.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Proprits
Il ny a quun seul chemin entre deux sommets
quelconques dun arbre
Un arbre avec N sommets a N 1 artes
Un arbre binaire avec N sommets internes possde N + 1
feuilles
Le chemin externe dun arbre binaire avec N sommets
internes est 2N + L, I tant la longueur interne de larbre.
La hauteur dun arbre binaire plein est approximativement
log
2
N.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Reprsentation des arbres binaries
Comme une liste chane, mais avec 2 liens par structure.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Exemple dlment de liste chane
public class listNode{
protected Object data;
protected listNode next;
public listNode ( ) {
next = null;
data = null;
}
public listNode( Object d, listNode n ) {
data = d;
next = n;
}
public void setNext( listNode n) {
next = n;
}
public void setData( Object d) {
data = d;
}
public listNode getNext ( ) {
return next;
}
public Object getData ( ) {
return data;
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Exemple dlment darbre binaire
public class btreeNode{
protected Object data, key;
protected btreeNode left, right;
public btreeNode ( ) {
data = null;
left = right = null;
}
public btreeNode( Object d ) {
data = d;
left = right = null;
}
public void setLeft( btreeNode l ) {
left = l;
}
public void setRight( btreeNode r ) {
right = r;
}
public void setData( Object d) {
data = d;
}
public void setKey( Object k) {
key = k;
}
public btreeNode getLeft ( ) {
return left;
}
public btreeNode getRight ( ) {
return right;
}
public Object getData ( ) {
return data;
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Exemple dapplication: arbre danalyse parsing tree
Soit lexpression A * (((B+C)*(D*E))+F)
On peut reprsenter cette expression de la faon suivante:
On transforme lexpression en inxe : A B C + D E * *
F + *
on scanne lexpression inxe de gauche droite
les oprandes forment un lment darbre sans enfants qui
sont simplement empiles
les oprateurs forment un lment darbre. Lenfant de
gauche et de droite sont dpils.
On continue jusqu la n, on obtient un arbre qui
represente lexpression, dont les operandes forment les
feuilles et les oprateurs les branches.
Cette faon de procder est la base des "scanners",
indispensables pour la technologie des compilateurs,
interprteurs, etc.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Code pour lanalyse syntaxique
[fragile]
public class Scanner{
void scannexp( File input) {
for ( stackinit( ) ; read( input, c) ; ) {
x = new btreeNode ( ) ;
x. setData( c ) ;
if ( x == + | | c == *) {
x. setRight( pop ( ) ) ;
x. setLeft( pop ( ) ) ;
}
push( x ) ;
}
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Traverse dun arbre binaire
Une fois quun arbre binaire a t construit, en gnral on
veut en faire quelque-chose, en particulier le traverser.
Pour une liste cest facile, pour un arbre on a plusieurs
choix.
En pr-ordre : mthode rcursive: on visite la racine, puis
le sous-arbre de gauche, puis le sous-arbre de droite
(permet dexprimer larbre prcdent en inxe).
Dans lordre: on visite dabord le sous-arbre de gauche,
puis la racine, puis le sous-arbre de droite (permet le tri).
En post-ordre : visite dabord le sous-arbre de gauche, puis
le sous-arbre de droite, puis la racine (permet dexprimer
larbre prcdent en post-xe).
Par niveau: de haut en bas et de gauche droite.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Mise en oeuvre des la traverse ordonnes
public class Traverse{
void preorder( Tree T) {
btreeNote root=T. Root( ) , t;
push( root ) ;
while ( ! stackempty( ) ) {
t = pop ( ) ; visit( t ) ;
if ( t. getRight( ) ) push( t. getRight ( ) ) ;
if ( t. getLeft( ) ) push( t. getLeft ( ) ) ;
}
}
}
Modications triviales pour les autres traverses ordonnes.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Mise en oeuvre de la traverse par niveaux
Mme chose, mais cette fois-ci avec une le dattente:
public class Traverse{
void level( Tree T) {
btreeNote root=T. Root( ) , t;
put( root ) ;
while ( ! queueempty( ) ) {
t = get ( ) ; visit( t ) ;
if ( t. getRight( ) ) put( t. getRight ( ) ) ;
if ( t. getLeft( ) ) put( t. getLeft ( ) ) ;
}
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Traverse recursive
public class Traverse{
void rectrav( btreeNode t) {
if ( t) {
rectrav( t. getLeft ( ) ) ;
visit( t ) ;
rectrav( t. getright ( ) ) ;
}
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Dictionnaires
On cherche rsoudre le problme suivant:
public class Exemple{
void level( Tree T) {
SomeStruct a;
Object cle, o, p;
// Entr\ee dans un dictionnaire
a. set( cle, o ) ; // equiv: a[cle] = o;
// recherche dans un dictionnaire
p = a. get( cle ) ; // equiv: p = a[cle];
}
Note: on recherche les donnes par cl.
Q: comment rsoudre ce problme ?
Solution plus simple : un simple tableau, ou une liste.
Autre faon plus efcace : utiliser un arbre.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Arbre de recherche
Dans un arbre binaire, on met les cls plus petites
gauche et les cls plus grandes droite.
Lide est assez simple : on utilise un arbre binaire
(structure connue) pour maintenir une structure trie. La
recherche seffecture naturellement.
La structure darbre binaire permet de mettre en oeuvre la
stratgie diviser pour regner clairement et simplement.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Code pour la recherche dans un arbre binaire
public class BinTree {
private Tree T;
Object search( Object key) {
btreeNote root=T. Root( ) , t;
t = root;
// attention aux recherches infructueuses
while ( key ! = t. getKey ( ) ) {
if ( key < t. getKey ( ) )
t = t. getLeft ( ) ;
else
t = t. getRight ( ) ;
}
return( t. getData ( ) ) ;
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Pb1: recherches infructueuses
Dans le cas prsent une recherche infructueuse va
gnrer une exception.
Pour viter cela on peut avoir un noeud special z vers
lequels pointe tous les enfants non attribus.
Dans ce cas une recherche infructueuse retournera
simplement null.
Pour rester concis, dans la suite on garde la version avec
exceptions.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Pb2: Maintenir la structure darbre
Bien entendu pour que a marche, il faut un arbre binaire
pour commencer.
Il faut donc tre capable dinsrer des donnes dans un
arbre binaire tout en maintenant la structure.
Pour cela, on fait une recherche infructueuse force, et on
insre cet endroit.
Une recherche infructueuse foree signie que si lobjet
est dj dans larbre, alors on linsre une deuxime fois.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Insertion dans un arbre binaire
public class BinTree {
private Tree T;
void insert( Object key, Object data) {
btreeNote root=T. Root( ) , t, x;
t = root;
x = t. getRight ( ) ;
// recherche d\elib\erement infructueuse
while ( x ! = null) {
t = x; // remember last non-null
if ( key < x. getKey ( ) )
x = x. getLeft ( ) ;
else
x = x. getRight ( ) ;
}
x = new TreeNode;
x. setKey( key ) ; x. setData( data) ;
if ( key < t. getKey ( ) )
t. setLeft( x ) ;
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Tri dun arbre binaire
Note: le tri du contenu dun arbre binaire est preque gratuit:
public class BinTree {
private Tree T;
void treesort ( void) {
treesortr( T. Root ( ) ) ;
}
void treesortr( TreeNode n) {
if ( n ! = null) {
treesortr( n. getLeft ( ) ) ;
System. Console. Println( n. getData ( ) ) ;
treesortr( n. getRight ( ) ) ;
}
}
}
Cette methode de tri est remarquablement similaire
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Complexit
Dans le cas idal, o larbre est quilibr, recherche et
insertion sont logarithmiques.
Dans le pire des cas, o larbre est tout dun ct ou de
lautre, recherche et insertion sont linaires (comme un
tableau).
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Autres remarques
La dltion est plus complexe mettre en oeuvre (Q:
pourquoi?). Souvent on ne le fait pas, on utilise une
technique dite de deletion paresseuse, o on marque
simplement un noeud comme effac, et on reconstruit
larbre de temps en temps sans ces noeuds.
Il est impossible de garantir quun arbre binaire simple
reste quilibr. Pour pallier ce dfaut, on utilise des arbres
diffrents:
Les arbres 2-3-4 (qui contienne 1, 2, ou 3 cl pour chaque
noeud)
Les arbres rouges et noirs = Red-Black trees (arbres
binaires avec un bit de plus dinformation)
Les arbres AVL (AVL-trees)
Les B-trees, extension des arbres 2-3-4, qui forment la
base de toutes les bases de donnes.
Ltude de ces arbres prendrait trop de temps.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Tches priorit
Dans beaucoup dapplications, des structures avec cl doivent
tre trates dans un certain ordre, mais:
pas ncessairement toutes dun coup : on peut vouloir
collecter certaines donnes, puis trater certaines, puis en
collecter encore, etc.
on na pas forcment besoin de trier toutes les donnes
compltement. On peut par exemple ne vouloir que la
donne avec la cl la plus leve chaque itration.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Exemple de tels problmes
Les problmes qui requirent une telle structure sont en fait
nombreux.
Compression de chier (codage de Huffman)
Allocation mmoire (retourner le plus grand espace vide)
Certaines recherches sur graphes
De nombreux algorithmes danalyse dimage.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Quelle structure utiliser ?
Pour rsoudre ce problme on pourrait utiliser un tableau, un
vecteur ou une liste ou un arbre binaire, mais aucune de ces
structures nest idale:
Les structures plates ne permettent pas une recherche
efcace
Les arbres binaires simples ne garantissent pas une
recherche efcace non plus.
On introduit la structure de le priorit.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Oprations ncessaires aux les priorit
on veux pouvoir effectuer les oprations suivante efcacement:
Construction dune le partir de donnes initiales ;
Insertion dune donne cl quelconque ;
Rechercher ou Retirer llment le plus grand (ou le plus
petit) ;
Remplacement de llment le plus grand par un autre ;
Changement de priorit;
Deletion dun lment.
Note: type de donne abstrait.
Certaines de ces oprations peuvent tre concues comme des
opration composes, par exemple remplacement = insertion
puis retirer, mais peuvent peut-tre se mettre en oeuvre de
faon plus efcace en tant que telles.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Mise en oeuvre lmentaire
En utilisant un simple tableau:
public class SimplePQ {
private Object T [ ] ;
int N
void construct( int M, Object D [ ] ) {
T = new Object[ M ] ;
N = M
int i;
for ( i = 0 ; i < N ; ++i)
T[ i] = D[ i ] ;
}
void insert ( Object v) {
T[++N] = v;
}
Object remove( ) {
int j, max;
Object v;
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Critique de la mise en oeuvre lmentaire
La recherche est linaire en N.
Au lieu dun vecteur on pourrait utiliser une liste ordonne,
mais la cration demanderait un tri, et linsertion serait
linaire.
Q: si au lieu dune liste ordonne on utilise un vecteur
ordonn, quelle est loperation la plus chre ?
Q: toute structure de le priorit induit une mthode de tri.
Comment ? Quel tri correspond lutilisation dun vecteur ?
dune liste ordonne ?
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Structure de tas
On utilise un arbre binaire
Condition du tas: la cl dans chacun des noeuds doit tre
plus grande ou gale (ou plus petite ou gale) que la cl
dans chacun de ses enfants. Note: la racine contient donc
llment le plus grand.
Un tas est toujours quilibr
Un tas peut tre reprsent simplement par un tableau.
1 2 3 4 5 6 7 8 9 10 11 12
X T O G S M N A E R A I
Les enfants de j sont en position 2j et 2j+1. Le parent
de i est i/2.
Il y a juste assez de exibilit dans cet arrangement pour
la le priorit.
pour N entres il y a log
2
N gnrations. Trivial de
parcourir un tas.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Maintenir la structure de tas
Lide dans lutilisation des tas est de faire une modication
de la structure, puis dapporter des changements simples
pour maintenir la structure.
Certaines oprations manipule la structure par la racine,
dautres par la n.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Insertion dans un tas
public class HeapPQ {
private Object T [ ] ;
int N;
void upheap( int k) {
Object v;
v = T[ k] ; T [ 1 ] . setKey( INT_MAX ) ;
while ( T[ k / 2 ] . getKey( ) <= v. getKey ( ) ) {
T[ k] = T[ k/ 2] ; k = k/ 2;
}
T[ k] = v;
}
void insert( Object v) {
T[++N] = v;
upheap( N ) ;
}
}
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Retirer llment le plus grand
public class HeapPQ {
private Object T [ ] ;
int N;
void downheap( int k) {
Object v;
int j;
v = T[ k] ;
while ( k <= N/ 2) {
j = 2k;
if ( j < N && ( T[ j ] . getKey( ) < T[ j+1] . getKey (
j++;
if ( v. getKey( ) > T[ j ] . getKey ( ) )
break;
T[ k] = T[ j] ; k = j;
}
T[ k] = v;
}
Objet remove( void) {
Object v = T [ 1 ] ;
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Heapsort
Tas = heap en anglais. Le tri correspondant la structure de
tas est heapsort. Aussi efcace que QuickSort.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Conclusion provisiore
Une grosse partie (30-50%) de lalgorithmique consiste en
des faons triviales et non triviales de trier et de
rechercher.
Parmi le reste :
Traitement de chanes
Algorithmes gomtriques (intersections de droites, etc)
Graphes
Algorithmes mathmatiques (nombres alatoires,
arithmtique, algbre linaire, FFT, etc)
Programmation dynamique et linaire
Problmes difciles
Presque tous utilisent des structures de donnes
adquates.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Problmes plus ou moins faciles
Certains problmes sont plus faciles que dautres, au sens
o il existe des algorithmes plus ou moins efcaces pour
les rsoudre
Accs alatoire dans un vecteur: O(1).
Maintien du plus petit (ou plus grand) lment dans un tas:
O(logN)
Recherche du plus petit lment dans un vecteur : O(N)
Tri gnral: O(N logN)
Multiplication lmentaire de deux nombres : O(N
2
)
Multiplication lmentaire de deux matrices : O(N
3
)
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Problmes plus ou moins faciles (suite)
Il existe des problmes plus difciles. Meilleurs
algorithmes connus pour les problmes suivants:
Plus grand convexe inscrit dans un polygone : O(N
7
)
SUBSET-SUM : O(2
(
N/2) ?
Meilleur coup aux checs (ou au go): O(p
N
)
Vrit des expressions dans larithmetique de Preburger :
(2
2
cN
)
Probl ` me de larrt : pas de solution !.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Simplication des classes de difcults
On considre la classe des problmes qui ont une solution
en O(kN
p
), k et p constantes.
Ces problmes sont dits polynomiaux, et appartiennent
la classe P.
Tous les problmes plus difciles appartiennent la classe
Non-P.
En quelque sorte, les problmes dans P sont faciles et
les problmes dans non-P sont difciles.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Simplication ignore certaines choses
Une solution un problme dans P en O(N
2
) nest pas
aussi utile quen O(N log N). (exemple : FFT)
Constantes, dtails de mise en oeuvre sont tous ignors.
On exige une solution exacte. Parfois une solution
approche est tout fait sufsante, exemple: Kasparov
battu par Deep Blue.
Cette distinction a surtout une valeur mathmatique plutt
que pratique
Utile nanmoins, ne serais-ce que pour reconnatre les
problmes vraiment difcile
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Dautres difcults surgissent
Il existe des problmes clairement dans P, par exemple le
tri gnral.
Il existe des problmes clairement dans non-P, par
exemple le problme des checs.
Mais il existe un vaste nombre de problmes dont on ne
sait pas sils appartiennent lune ou lautre classe. Il ne
sont que apparemment difciles, c--d on ne connait pas
dalgorithme efcace pour les rsoudre mais on na pas
non plus russi dmontrer quun tel algorithme nexiste
pas.
SUBSET-SUM
Cycle Hamiltonien dans un graphe
Allocation de tche dans un systme dexploitation
factorisation dun entier
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Les chercheurs trouvent parfois
Parce quon na pas russi trouver un algorithme efcace
pour le moment ne veut pas dire quil nen existe pas.
Les algorithmes efcaces sur les graphes datent des
annes 50-60 pour la plupart.
Certains problmes nont t rsolus que trs rcemment,
par exemple le problme du postier Chinois.
Un algorithme polynomial pour dcid si un entier est
premier ou non t trouv pour la premire fois en 2002.
Il existe un algorithme quantique pour factoriser un entier
en temps polynomial (algorithme de Shor).
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Il est facile de rendre un problme facile difcile
Souvent un problme facile se transforme en problme
apparemment difcile avec peu de changements:
Cycle Eulerien, facile ; cycle Hamiltonien, difcile.
Chemin minimal, facile ; chemin maximal sans cycle,
difcile.
Hugues Talbot Algorithmique
university-logo
Problmes difciles
Comment progresser ?
Il faut formaliser un peu, prciser une classe de problme
gneraux contenant des problmes apparemment difciles.
Problme dcisionnels.
Oracle, qui donne une solution si une existe, veriable en
temps polynomal.
Classe des problmes NP, non-deterministes
polynomiaux. ne pas confondre avec non-P.
Hugues Talbot Algorithmique

Вам также может понравиться