Algorithmique en C, C++, Java, Python et PHP
2e édition
Jean-Michel Léry
Ellipses
Introduction
1
Environnement et conventions7
1. Les étapes de développement d'une application
7
1.1. L'analyse7
1.2. L'algorithme10
1.3. L'écriture du programme dans un langage de programmation11
2. Le pseudo-langage
18
2.1. Son rôle18
2.2. Conventions syntaxiques18
3. Le génie logiciel
20
3.1. La modélisation des données20
3.2. La modularité du programme20
3.3. La lisibilité du programme20
3.4. Privilégier les solutions simples21
3.5. L'utilisation de conventions d'écriture21
4. La performance algorithmique
21
Résumé
22
Exercices
22
Solutions
23
Les traitements logiques29
1. Les tests ou instructions conditionnelles
29
1.1. Présentation29
1.2. La logique booléenne30
1.3. L'instruction SI ALORS SINON31
1.4. Le choix multiple33
2. Les boucles ou instructions répétitives
37
2.1. Présentation des boucles37
2.2. Comprendre le fonctionnement d'une boucle46
2.3. Construire une boucle49
3. Les sous-programmes
54
3.1. Les procédures54
3.2. Les fonctions54
3.3. Organisation en modules autonomes55
4. La complexité algorithmique
61
4.1. Principe61
4.2. L'analyse de la complexité62
4.3. Les grandes familles de complexité62
4.4. Choisir un algorithme64
Résumé
64
Exercices
64
Solutions
67
La gestion des données93
1. Principe de traitement des données
93
1.1. Le rôle des variables93
1.2. Le rôle des fichiers94
2. Les tableaux
94
2.1. Description94
2.2. L'allocation mémoire95
2.3. Gestion d'un tableau96
3. Les enregistrements
121
3.1. Description122
3.2. Gestion d'un enregistrement122
4. Les pointeurs
126
4.1. Description126
4.2. Les pointeurs et l'allocation statique de la mémoire127
4.3. L'allocation dynamique de la mémoire129
4.4. La particularité de Java130
4.5. La particularité de PHP130
4.6. La particularité de Python130
5. Les listes chaînées
130
5.1. Description130
5.2. L'allocation mémoire131
5.3. Gestion d'une liste chaînée132
6. Gestion des données complexes
159
6.1. Les tableaux d'enregistrements159
6.2. Les listes d'enregistrements165
7. Variantes sur les tableaux
166
7.1. Les tableaux dynamiques166
7.2. Les tableaux de pointeurs170
Résumé
172
Exercices
172
Solutions
173
La récursivité195
1. Principe
195
2. Diviser pour résoudre
200
3. Suppression de la récursion
201
4. Récursivité croisée
203
Résumé
206
Exercices
206
Solutions
208
Les données abstraites219
1. Les piles
219
1.1. Principe219
1.2. Les primitives220
1.3. Utilisation des tableaux220
1.4. Utilisation des listes chaînées221
1.5. Exemples223
1.6. Les piles et la récursivité234
1.7. La classe C++ stack236
1.8. La classe Java Stack236
1.9. La classe PHP SpIStack237
1.10. Les listes Python en Piles238
1.11. La classe Python deque238
2. Les files
238
2.1. Principe238
2.2. Utilisation des tableaux239
2.3. Utilisation des listes chaînées240
2.4. La classe C++ deque241
2.5. L'interface Java Queue avec la classe LinkedList242
2.6. La classe PHP SpIQueue243
2.7. Les listes Python en Files244
2.8. La classe Python deque244
3. Les arbres
245
3.1. Principe et définitions245
3.2. Les types d'arbres246
3.3. Création d'un arbre binaire d'expression247
3.4. Parcours d'un arbre binaire249
3.5. Les arbres de recherche268
Résumé
269
Exercices
270
Solutions
271
Les tris317
1. Tris élémentaires
317
1.1. Le tri par sélection317
1.2. Le tri par insertion325
1.3. Le tri à bulles329
1.4. Le tri par comptage333
2. Tris avancés
334
2.1. Le tri shell334
2.2. Le tri indirect340
2.3. Le tri rapide ou quicksort351
Résumé
359
Exercices
359
Solutions
360
Les recherches371
1. La recherche séquentielle
371
2. La recherche dichotomique
376
2.1. Principe376
2.2. Version récursive376
2.3. Version itérative381
3. La recherche par interpolation
382
4. Tables de hachage ou adressage dispersé
383
4.1. Principe383
4.2. La fonction de hachage384
4.3. Table de hachage chaînée386
4.4. Table de hachage à adressage ouvert403
5. Les arbres de recherche équilibrés
407
5.1. Principe407
5.2. Fonctionnement d'un arbre AVL408
5.3. Gestion du facteur d'équilibre409
5.4. Rotations des arbres AVL410
Résumé
414
Exercices
415
Solutions
416
Les méthodes numériques463
1. Interpolation polynomiale
463
1.1. Principe463
1.2. Rappel sur les polynômes464
1.3. Le polynôme d'interpolation465
1.4. Le programme469
1.5. La fonction interpolate.interp1d de la bibliothèque Python scipy484
2. Méthode des moindres carrés
486
2.1. Principe486
2.2. Rappel sur le calcul des distances487
2.3. Le programme488
2.4. La fonction linalg.lstsq de la bibliothèque Python numpy498
3. Recherche des solutions d'équations
500
3.1. Principe de la méthode de Newton500
3.2. Rappel sur les dérivées501
3.3. Choix du point de départ pour la méthode de Newton504
3.4. Le programme506
3.5. La fonction optimize.bisect de la bibliothèque Python scipy541
Résumé
542
Les algorithmes classiques543
1. Algorithme du plus court chemin de Dijkstra
543
1.1. Rappel sur les graphes543
1.2. Description de l'algorithme544
1.3. L'algorithme547
1.4. Application au calcul d'itinéraire573
2. Algorithme de compression de données de Huffman
574
2.1. Principe de la compression de données574
2.2. Description de l'algorithme575
2.3. L'algorithme579
Résumé
637
Index
639