Caractéristiques d`un algorithme

publicité
CER SCHMITT Mathieu
Mondial Dev Offshore
Objectifs :
-
Comprendre le fonctionnement de l’algorithme
Comprendre le principe de l’offshore
Savoir réaliser un mémento sur l’algorithmique
Savoir qu’il y a différents types de séquence d’algo et connaitre les différents types de contrôle en fonction
des séquences.
Définitions des mots-clés
Offshore : L’offshoring désigne la délocalisation des activités de service ou de production de certaines entreprises
vers des pays à bas salaire. Ces délocalisations ont surtout pour but d’assurer des services tels que la maintenance
d’applications informatiques, les centres d'appel, la gestion, l’achat, etc. Dans le domaine de la finance et de la
gestion d'entreprise, le terme offshore est utilisé pour désigner la création d'une entité juridique dans un autre pays
que celui où se déroule l'activité, afin d'optimiser la fiscalité (paradis fiscal) ou la gestion financière des capitaux ou,
plus récemment, des activités de service (achat, développement informatique : offshore developpement, etc.), voire
de production. À ce titre, l'offshoring se distingue de moins en moins de la délocalisation. Selon une récente étude
du cabinet Pierre Audoin Conseil, près de 3% de la sous-traitance informatique française sera réalisée en mode
"offshore" en Inde ou dans les pays d´Europe de l´Est à l´horizon 2004. Convaincus par ce modèle nous avons
sélectionné et regrouper des acteurs de l’offshore programming sur ce portail.
Filiale : Une filiale est une entreprise dont le capital a été formé pour plus de sa moitié du capital par des apports
d’une autre société dite société mère, qui en assure généralement la direction, l’administration et le contrôle par
l’intermédiaire d’une ou plusieurs personnes, administrateurs ou gérants qu’elle a désignés. Elle constitue une entité
morale distincte de la maison mère sur le plan juridique.
Codage de module : De façon générale un codage permet de passer d'une représentation des données vers une
autre. Le codage de module doit donc montrer la manière d’organiser les modules afin de les traduires en
Algorithme.
SADT : SADT (en anglais Structured Analysis and Design Technique) - est une méthode d'origine américaine,
développée par Softech par Doug Ross en 1977 puis introduite en Europe à partir de 1982 par Michel Galiner elle se
répandit vers la fin des années 1980 comme l'un des standard de description graphique d'un système complexe par
analyse fonctionnelle descendant, c'est-à-dire que l'analyse chemine du général (dit "niveau A0") vers le particulier
et le détaillé (dits "niveaux A"). SADT est une démarche systémique de modélisation d'un système complexe ou d'un
processus opératoire.
Algorithme : Un algorithme est un moyen pour un humain de présenter la résolution par calcul d’un problème à une
autre personne physique (un autre humain) ou virtuelle (un calculateur). En effet, un algorithme est un énoncé dans
un langage bien défini d’une suite d’opérations permettant de résoudre par calcul un problème. Si ces opérations
1
CER SCHMITT Mathieu
s’exécutent en séquence, on parle d’algorithme séquentiel. Si les opérations s’exécutent sur plusieurs processeurs
en parallèle, on parle d’algorithme parallèle. Si les tâches s’exécutent sur un réseau de processeurs on parle
d’algorithme réparti ou distribué.
Formaliser : Dans ce qui suit, on entend par problème de planification le couple formé par un domaine d'application
(exemple: un chantier) et ce que l'on attend d'un système de planification (exemple: générer des plans pour
construire diverses structures).
La tâche de formalisation d'un problème de planification possède deux préconditions:
1. bien connaitre les caractéristiques de l'environnement à modéliser et du problème de planification tel qu'il
se pose réellement ; et
2. avoir un minimum de connaissances sur le fonctionnement du système de planification (de manière à
appréhender ses points forts et surtout, ses limites, à la fois au niveau de la représentation et à celui de
l'algorithmique).
La principale difficulté pour formaliser un problème tient alors à la recherche d'un compromis entre:
1. la nécessité d'une représentation la plus fine possible afin de prendre en compte un maximum de
contraintes réelles et de trouver plan un relativement précis au niveau des actions planifiées; et
2. les limitations du système du point de vue de l'expressivité du formalisme et des performances de
l'algorithmique mise en jeu.
Externalisation : L'externalisation, aussi appelée outsourcing, désigne le transfert de tout ou partie d'une fonction
d'une entreprise vers un partenaire externe. Elle consiste très souvent en la sous-traitance des activités non
essentielles et non stratégiques (celles qui ne sont pas productrices de revenus) d'une entreprise. Il s'agit d'un outil
de gestion stratégique qui se traduit par la restructuration d’une entreprise autour de sa sphère d’activités : ses
compétences de base et son cœur de métier (core business en anglais).
L'externalisation diffère de la simple prestation extérieure de services, et de la simple sous-traitance, dans
la mesure où il y a
-
pilotage étroit par l'entreprise donneuse d'ordre,
engagement du prestataire externe.
Typologie : Une typologie est une démarche, souvent scientifique, consistant à définir un certain nombre de types
afin de faciliter l'analyse, la classification et l'étude de réalités complexes.
Par extension, le terme typologie désigne parfois la liste des types propres à un domaine d'étude.
Module de code : Le terme module en programmation identifie une structure de programmation.
Un module de code, est donc le code qui se trouve dans le module.
Module informatique : Un module en programmation désigne un espace de nommage. Pour reprendre l'image de la
programmation objet, un module est une instance unique qui n'utilise pas d'héritage et ne contient aucun module
fils. Chaque module peut exporter ou importer certains symboles comme des variables, des fonctions ou des classes.
Les modules peuvent se regrouper en package éventuellement hiérarchique.
Règles de communication : La communication (souvent abrégée en com) est l'action, le fait de communiquer,
d'établir une relation avec autrui, de transmettre quelque chose à quelqu'un, l'ensemble des moyens et techniques
2
CER SCHMITT Mathieu
permettant la diffusion d'un message auprès d'une audience plus ou moins vaste et hétérogène et l'action pour
quelqu'un, une entreprise d'informer et de promouvoir son activité auprès du public, d'entretenir son image, par
tout procédé médiatique.
Axe de recherche
Etudier les bases de l’algorithmique
Notion d'algorithme
La mise au point d'un programme informatique se fait en plusieurs étapes.
Il s'agit de fournir la solution à un problème, la première étape consiste donc à analyser le problème, c'està-dire en cerner les limites et le mettre en forme dans un langage descriptif, on parle généralement
d'analyse pour décrire le processus par lequel le problème est formalisé. Le langage de description utilisé
pour écrire le résultat de l'analyse est appelé algorithme. L'étape suivante consiste à traduire l'algorithme
dans un langage de programmation spécifique, il s'agit de la phase de programmation.
Le langage de programmation est l'intermédiaire entre l'humain et la machine, il permet d'écrire dans un
langage proche de la machine mais intelligible par l'humain les opérations que l'ordinateur doit effectuer.
Ainsi, étant donné que le langage de programmation est destiné à l'ordinateur, il doit donc respecter une
syntaxe stricte. Un algorithme peut toutefois aboutir à plusieurs programmes.
Le programme est ensuite transformé en langage machine lors d'une étape appelée compilation. La
compilation est une phase réalisée par l'ordinateur lui-même grâce à un autre programme appelé
compilateur.
La phase suivante s'appelle l'édition de liens, elle consiste à lier le programme avec tous les éléments
externes (généralement des librairies auxquelles il fait référence).
3
CER SCHMITT Mathieu
Caractéristiques d'un algorithme
L'algorithme est un moyen pour le programmeur de présenter son approche du problème à d'autres
personnes. En effet, un algorithme est l'énoncé dans un langage bien défini d'une suite d'opérations
permettant de répondre au problème. Un algorithme doit donc être :
-
-
lisible: l'algorithme doit être compréhensible même par un non-informaticien
de haut niveau: l'algorithme doit pouvoir être traduit en n'importe quel langage de programmation,
il ne doit donc pas faire appel à des notions techniques relatives à un programme particulier ou
bien à un système d'exploitation donné
précis: chaque élément de l'algorithme ne doit pas porter à confusion, il est donc important de
lever toute ambiguïté
concis: un algorithme ne doit pas dépasser une page. Si c'est le cas, il faut décomposer le problème
en plusieurs sous-problèmes
structuré: un algorithme doit être composé de différentes parties facilement identifiables
Pseudo-code :
Le pseudo code d’un algorithme débute toujours par les caractéristiques suivantes :
•Nom de l’algorithme
•Données (en entrée)
•Résultats (en sortie)
•Initialisation des variables locales
Variable :
Type Numérique
Plage
Byte (octet)
0 à 255
Entier simple
-32 768 à 32 767
Entier long
-2 147 483 648 à 2 147 483 647
Réel simple
-3,40x1038 à -1,40x1045 pour les valeurs négatives
1,40x10-45 à 3,40x1038 pour les valeurs positives
4
CER SCHMITT Mathieu
1,79x10308 à -4,94x10-324 pour les valeurs négatives
Réel double
4,94x10-324 à 1,79x10308 pour les valeurs positives
Structure :
-
Bloc « tant que » :
Structures répétitives (tant que)
Tant que CONDITION faire instruction ;
Instruction ;
Fin tant que
-
bloc « si » :
Structures alternatives (si) => exécution exclusive.
Si CONDITION alors instruction si vrai
Sinon instruction si faux
Fin si
-
Bloc « pour » :
Pour I allant de d à f faire instruction ; //séparateur d’instruction
Instruction ;
Fin pour
-
bloc début
Début
Instruction ;
Instruction ;
Fin
Affectation :
En pseudo-code, l'instruction d'affectation se note avec le signe ← Ainsi :
5
CER SCHMITT Mathieu
Toto ← 24
Attribue la valeur 24 à la variable Toto.
Ceci, soit dit en passant, sous-entend impérativement que Toto soit une variable de type numérique. Si Toto a été
défini dans un autre type, il faut bien comprendre que cette instruction provoquera une erreur. On peut en revanche
sans aucun problème attribuer à une variable la valeur d’une autre variable, telle quelle ou modifiée. Par exemple :
Tutu ← Toto
Signifie que la valeur de Tutu est maintenant celle de Toto.
Notez bien que cette instruction n’a en rien modifié la valeur de Toto : une instruction d’affectation ne modifie que
ce qui est situé à gauche de la flèche.
Tutu ← Toto + 4
Si Toto contenait 12, Tutu vaut maintenant 16. De même que précédemment, Toto vaut toujours 12. Tutu ← Tutu +
1 Si Tutu valait 6, il vaut maintenant 7. La valeur de Tutu est modifiée, puisque Tutu est la variable située à gauche de
la flèche.
Opérateurs
Un opérateur est un signe qui relie deux valeurs, pour produire un résultat.
Les opérateurs possibles dépendent du type des valeurs qui sont en jeu.
Opérateurs numériques
Ce sont les quatre opérations arithmétiques tout ce qu’il y a de classique.
+ : addition
- : soustraction
* : multiplication
/ : Division
Mentionnons également le ^ qui signifie « puissance ». 45 au carré s’écrira donc 45 ^ 2.
Enfin, on a le droit d’utiliser les parenthèses, avec les mêmes règles qu’en mathématiques. La multiplication et la
division ont « naturellement » priorité sur l’addition et la soustraction. Les parenthèses ne sont ainsi utiles que pour
modifier cette priorité naturelle.
Cela signifie qu’en informatique, 12 * 3 + 5 et (12 * 3) + 5 valent strictement la même chose, à savoir 41. Pourquoi
dès lors se fatiguer à mettre des parenthèses inutiles ? En revanche, 12 * (3 + 5) vaut 12 * 8 soit 96. Rien de difficile
là-dedans, que du normal.
Opérateur alphanumérique &
Cet opérateur permet de concaténer, autrement dit d’agglomérer, deux chaînes de caractères.
Exemple
6
CER SCHMITT Mathieu
Variables A, B, C en Caractère
Début
A ← "Gloubi"
B ← "Boulga"
C←A&B
Fin
La valeur de C à la fin de l’algorithme est "GloubiBoulga"
Opérateurs logiques (ou booléens)
Il s’agit du ET, du OU, du NON et du mystérieux (mais rarissime, sauf dans la plupart des algos de hashage et de
cryptographie) XOR.
Différences de variable avec ou sans guillemets
Pour revenir à présent sur le rôle des guillemets dans les chaînes de caractères et sur la confusion, comparons
maintenant deux algorithmes suivants :
Exemple n°1
Début
Riri ← "Loulou"
Fifi ← "Riri"
Fin
Exemple n°2
Début
Riri ← "Loulou"
Fifi ← Riri
Fin
La seule différence entre les deux algorithmes consiste dans la présence ou dans l’absence des guillemets lors de la
seconde affectation. Et l'on voit que cela change tout !
Dans l'exemple n°1, ce que l'on affecte à la variable Fifi, c'est la suite de caractères R – i – r - i. Et à la fin de
l’algorithme, le contenu de la variable Fifi est donc « Riri ».
Dans l'exemple n°2, en revanche, Riri étant dépourvu de guillemets, n'est pas considéré comme une suite de
caractères, mais comme un nom de variable. Le sens de la ligne devient donc : « affecte à la variable Fifi le contenu
7
CER SCHMITT Mathieu
de la variable Riri ». A la fin de l’algorithme n°2, la valeur de la variable Fifi est donc « Loulou ». Ici, l’oubli des
guillemets conduit certes à un résultat, mais à un résultat différent.
A noter, car c’est un cas très fréquent, que généralement, lorsqu’on oublie les guillemets lors d’une affectation de
chaîne, ce qui se trouve à droite du signe d’affectation ne correspond à aucune variable précédemment déclarée et
affectée. Dans ce cas, l’oubli des guillemets se solde immédiatement par une erreur d’exécution.
Instructions de lecture et d'écriture
Instruction de lecture
L'instruction de prise de données sur le périphérique d'entrée (en général le clavier) est :
variable <- lire()
L'exécution de cette instruction consiste à affecter une valeur à la variable en prenant cette valeur sur le
périphérique d'entrée. Avant l'exécution de cette instruction, la variable avait ou n'avait pas de valeur. Après, elle a
la valeur prise sur le périphérique d'entrée.
Instruction d'écriture
L'instruction de restitution de résultats sur le périphérique de sortie (en général l'écran) est :
écrire (liste d'expressions)
Cette instruction réalise simplement l'affichage des valeurs des expressions décrites dans la liste. Ces instructions
peuvent être simplement des variables ayant des valeurs ou même des nombres ou des commentaires écrits sous
forme de chaînes de caractères.
Exemple d'utilisation :
écrire(x, y+2, "bonjour")
Notion de fonctions
Une fonction est un algorithme autonome, réalisant une tâche précise, auquel on transmet des valeurs lors de son
appel et qui retourne une valeur à la fin de son exécution. La notion de fonction est très intéressante car elle permet,
pour résoudre un problème, d'employer une méthode de décomposition en sous-problèmes distincts. Elle facilite
aussi la réutilisation d'algorithmes déjà développés par ailleurs. Mais nous n'apprendrons pas dans ce chapitre à les
appeler !
Une fonction est introduite par un en-tête, appelé aussi signature ou prototype, qui spécifie :
- le nom de la fonction
- les paramètres donnés et leur type
- le type du résultat
8
CER SCHMITT Mathieu
La syntaxe retenue pour l'en-tête est la suivante :
fonction nomFonction (liste des paramètres) : type du résultat
La liste des paramètres précise, pour chaque paramètre, son nom et son type. La dernière instruction de la fonction
indique la valeur retournée, nous la noterons :
retourne expression
Exemple de fonction
Ecrire une fonction calculant le périmètre d'un rectangle dont on lui donne la longueur et la largeur.
fonction calculerPérimètreRectangle (longueur:réel, largeur:réel):réel
début
périmètre <- 2 * (longueur + largeur)
retourne périmètre
fin
Lexique
- longueur : réel, longueur du rectangle
- largeur : réel, largeur du rectangle
- périmètre : réel, périmètre du rectangle
Instructions conditionnelles
Les exemples précédents montrent des algorithmes dont les instructions doivent s'exécuter dans l'ordre, de la
première à la dernière. Nous allons introduire une instruction précisant que le déroulement ne sera plus séquentiel.
Cette instruction est appelée une conditionnelle. Il s'agit de représenter une alternative où, selon les cas, un bloc
d'instructions est exécuté plutôt qu'un autre. La syntaxe de cette instruction est :
si condition
alors liste d'instructions
sinon liste d'instructions
fsi
Cette instruction est composé de trois partie distinctes : la condition introduite par si, la clause alors et la clause
sinon. La condition est une expression dont la valeur est de type booléen. Elle est évaluée. Si elle est vraie, les
instructions de la clause alors sont exécutées. Dans le cas contraire, les instructions de la clause sinon sont
exécutées.
On peut utiliser une forme simplifiée de la conditionnelle, sans clause sinon. La syntaxe est alors :
si condition
alors liste d'instructions
fsi
9
CER SCHMITT Mathieu
Etudier l’algorithmique parallèle
Qu’est ce qu’un algorithme parallèle ?
Introduction & Notions de base
Introduction
L’objectif du parallélisme est d’obtenir de meilleur performance par rapport aux calculateurs classiques
séquentiels :
-
Complexité en temps – Pour un problème donné, aller plus vite, en exploitant plus de processeurs.
-
Complexité en espace – Pour traiter des problèmes plus gros, en utilisant plus de mémoires.
Modèles du calcul parallèle
Un algorithme consiste en un flot d’instructions à exécuter sur un flot de données. Il existe 4 modèles de
calculs, selon qu’il y a un ou plusieurs flots.
SISD (Single Instruction Single Data)
C’est le modèle séquentiel classique (Von Neumann).
Unité de contrôle
1 flot d’instructions
Processeur
1 flot de données
Mémoire
10
CER SCHMITT Mathieu
MISD (Multiple Instruction Single Data)
Il y a plusieurs flots d’instructions agissant sur un seul flot de données. On a n > 1 processeurs partageant
une unique mémoire.
A chaque étape de manière synchrone, une donnée est traitée parallèlement par les n processeurs qui
exécutent chacun une instruction spécifique.
Pas s’implémentation pratique.
P1
UC1
M
Pn
1 flot de données
UCn
n flots d’instructions
SIMD (Single Instruction Multiple Data)
On a n processeurs tous identiques ayant chacun une mémoire locale, où l’on peut stocker des données et
des instructions.
UC
Echange inter
processeurs
P1 + M1
Pn + Mn
1 flot d’instructions
n flots de données
Tous les processeurs exécutent la même instruction ou le même programme (SPMD) stocké en mémoire
locale sur des données différentes. Les processeurs fonctionnent de manière synchrone ; les instructions
peuvent être simples ou complexes ; seul un sous-ensemble des processeurs peut avoir à exécuter une
instruction.
Ce modèle est efficace surtout si on a un flot régulier sur des données régulières (auxquelles on accède de
manière prévisible).
Souvent les processeurs doivent communiquer pour s’échanger des résultats intermédiaires, ce qui
nécessite une coordination des activités. Ceci se fait de deux manières : soit un utilisant de la mémoire
partagée (SM), soit en utilisant un réseau d’interconnexion.
Mémoire partagée (SM)
11
CER SCHMITT Mathieu
C’est le modèle PRAM (parallel Random Access Machine). Les n processeurs utilisent une SM pour
échanger des données (une étape élémentaire de complexité).
Au cours du temps les n processeurs vont accéder en lecture et / ou écriture en SM, ce qui pose un
problème de concurrence des accès.
On distingue 4 modèle de concurrences :
-
EREW (Exclusive Read Exclusive Write)
-
CREW (Concurent Read Exclusive Write)
-
ERCW (Exclusive Read Concurent Write)
-
CRCW (Concurent Read Concurent Write)
A priori, il n’y a pas (du point de vue algorithmique) de problèmes pour la lecture concurrente. En écriture,
on doit fixer une règle pour gérer la concurrence…
Les modèles de calculs théoriques concurrents se réalisent en EREW avec une pénalisation de complexité
en Olog 2n sur n processeurs.
Le modèle à mémoire partagée est théoriquement très puissant, mais peu réaliste ! En effet, on ne prend
pas en compte la complexité globale du circuit d’accès à la mémoire qui dépend du nombre de processeurs
n partageant cette mémoire et de la taille m de la mémoire. Problème si n et m sont grands !
Traditionnellement, on a n < 64 et m de l’ordre du Go.
Une solution pour diminuer le coût consiste à diviser la mémoire en r blocs de taille m/r chacun. La
concurrence se fait uniquement au niveau des blocs…
Réseau d’interconnexion
Chaque processeur dispose d’un mémoire locale. Chaque paire de processeurs est connecté par un lien
bidirectionnel et à chaque étape du calcul, un processeur quelconque Pi peut recevoir une donnée de Pj et
envoyer une donnée vers Pk.
La topologie du réseau d’interconnexion (chaîne, grille 2D, arbre binaire, mélange parfait, cube…)
détermine la complexité des communications.
MIMD
C’est le modèle le plus général. Il y a n processeurs avec n flots d’instructions distincts et n flots de données
distincts. Les échanges inter-processeurs se font par une mémoire partagée ou par un réseau
d’interconnexion.
UCn
n flots d’instructions
P1 + M1
Echange inter
processeurs
UC1
Pn + Mn
n flots de données
12
CER SCHMITT Mathieu
Chaque processeur exécute son propre programme sur ses propres données, et chacun résout un sousproblème différent du problème original. Fonctionnement asynchrone, sans horloge globale. La
coordination des activités se fait via une mémoire partagée ou via un réseau couplé faiblement…
Analyse des algorithmes parallèles
Pour un problème de taille n, on note :
-
tn , le temps d’exécution parallèle au pire des cas pour un problème de taille n ;
-
wn , le temps d’exécution séquentielle (au pire) du meilleur algorithme séquentiel pour le
problème de taille n;
-
pn , le nombre de processeurs pour résoudre en parallèle le problème de taille n.
On introduit le speed-up ou l’accélération de l’algorithme parallèle.
SpeedUpn
wn
 pn
tn
On introduit le coût de l’algorithme parallèle.
cn pntn
Si tous les processeurs exécutent exactement le même nombre d’opérations, cn est exactement le
nombre total d’opérations, faits par tous les processeurs. Sinon, cn est un majorant de ce nombre. La
différence entre cn et wn représente l’overhead dû à la gestion du parallélisme.
t0ncnwn0
Si cn est asymptotiquement équivalent à wn , on dira que l’algorithme parallèle est à coût optimal. En
d’autres termes, un algorithme parallèle n’est pas à coût optimal si il existe un algorithme séquentiel dont
la complexité est asymptotiquement inférieur à son coût.
On introduit aussi l’efficacité qui est un rendement.
Eff n
SpeedUpn
1
pn
t0n 
Eff n1

 wn 
1
Si pn est constant, alors t0n est constant. Si pn est constant et n croissant, alors Eff n est
croissante. On a une granularité plus grosse et des processeurs mieux utilisés. Si n est constant et pn
croissant, alors Eff n est décroissante. Paradoxalement, le meilleur rendement est obtenu en séquentiel
(pas le meilleur temps) !
On peut chercher la relation entre la taille du problème n et le nombre de processeurs pn pour maintenir
une efficacité constante Eff nE .
 
wn E t0n
1E
On étudie cette relation en faisant varier n et pn donc t0n . On en déduit l’extensibilité de l’algorithme
parallèle ou scability.
13
CER SCHMITT Mathieu
Comprendre les Tableaux
Définition
L’énorme avantage des tableaux, c’est qu’on va pouvoir les traiter en faisant des boucles. Par exemple, pour
effectuer notre calcul de moyenne, cela donnera par exemple :
Les tableaux servent à désigner une suite finie d'éléments de même type au moyen d'une unique variable. Ces
éléments peuvent être des entiers, des chaînes, ... Ils sont stockés dans les différentes cases du tableau,
habituellement numérotées de 0 à n-1, n représentant la taille du tableau (le nombre de cases dans le tableau).
Le type d'un tableau précise l'intervalle de définition et le type (commun) des éléments.
tableau type_des_éléments[borne_inférieure .. borne_supérieure]
En général, nous choisirons toujours la valeur 0 pour la borne inférieure dans le but de faciliter la traduction de
l'algorithme vers les autres langages (C, Java, ...). Par exemple, pour un tableau de 10 entiers, on pourra écrire :
t : tableau entier[0..9]
Un tel tableau peut par exemple contenir les éléments suivants :
Indices :
0
1
2
3
4
5
6
7
8
9
Valeurs :
45
54
1
-56
22
134
49
12
90
-27
Pour accéder à un élément du tableau, il suffit de préciser entre crochets l'indice de la case contenant cet élément.
Par exemple, pour accéder au septième élément (49) du tableau d'entiers ci-dessus, on écrit : t[6]. L'instruction
suivante affecte à la variable x la valeur du premier élément du tableau, c'est à dire 45 :
x <- t [0]
L'élément désigné du tableau peut être utilisé comme n'importe quelle variable :
t[6] <- 43
Cette instruction a modifié le tableau t :
Indices :
0
1
2
3
4
5
6
7
8
9
Valeurs :
45
54
1
-56
22
134
43
12
90
-27
14
CER SCHMITT Mathieu
Parcourir un tableau ?
La plupart des algorithmes basés sur les tableaux utilisent des itérations permettant de faire un parcours complet ou
partiel des différents éléments du tableau. De tels algorithmes établissent le résultat recherché par récurrence en
fonction des éléments successivement rencontrés.
Les répétitions inconditionnelles sont le moyen le plus simple de parcourir complètement un tableau.
Exemple
Dans l'exemple suivant, la fonction affiche un à un tous les éléments d'un tableau de n éléments :
fonction écrireTableau(n : entier, tab : tableau entier[0..n-1])
début
pour i de 0 à n-1 faire // f1
écrire (tab[i])
// f2
fpour
fin
Lexique :
- i : entier, indice d'itération
- n : entier, taille du tableau
- tab : tableau entier [0..n-1]
Algorithme
début
n <- lire()
// 1
Pour i de 0 à n-1 faire
tab[i] <- lire()
// 2
fpour
écrireTableau(n, tab)
// 3
fin
Lexique :
- n : entier, taille du tableau
15
CER SCHMITT Mathieu
- tab : tableau entier[0..n-1]
Schéma de l'évolution de l'état des variables instruction par instruction :
On suppose que le tableau saisi, de taille 3, contient : 7, 10 et 8.
Instructions
Algorithme principal
Fonction écrireTableau
tab
n tab[0]
1
2 (3 exécutions)
3
tab[1]
tab
tab[2] n
i
tab[0]
3
tab[1]
tab[2]
10
8
/
7
10
8
/
3
f1
7
0
f2
f1
écrire()
1
f2
f1
écrire()
2
f2
f1
écrire()
(fin)
Exemple
La fonction suivante multiplie par 2 tous les éléments d'un tableau.
fonction doublerTableau(n : entier, t InOut : tableau entier[0..n-1])
début
Pour i de 0 à n-1 faire // 1
t[i] <- t[i]*2
// 2
fpour
fin
Lexique :
- n : entier, taille du tableau
- t : tableau entier[0..n-1], tableau modifiable
Schéma de l'évolution de l'état des variables instruction par instruction :
16
CER SCHMITT Mathieu
On suppose que l'appel de fonction est doublerTableau(3, tab), où tab est un tableau de taille 3 qui contient : 7, 10
et 8.
Instructions
Algorithme principal
Fonction doublerTableau
tab
t
nb tab[0] tab[1] tab[2] n i
avant appel
3
de la fonction
7
10
8
appel
2
14
1
20
retour à
l'algorithme
appelant
/
/
1
1
/
/
1
2
t[2]
Avec le mot clé Avec le mot clé Avec le mot clé
InOut t[0] et
InOut t[1] et
InOut t[2] et
tab[0] sont la tab[1] sont la tab[2] sont la
même
même
même
"variable"
"variable"
"variable"
0
2
t[1]
/
3
1
t[0]
2
16
/
/
(fin)
/
/
Comment gérer les parcours partiel ?
Certains algorithmes sur les tableaux se contentent de parcourir successivement les différents éléments du tableau
jusqu'à rencontrer un élément satisfaisant une certaine condition. Un tel parcours partiel est le plus souvent basé
sur une répétition conditionnelle.
17
CER SCHMITT Mathieu
Exemple
Algorithme
début
tab <- lire()
i <- 0
positif <- vrai
tant que positif et i < n faire
si tab[i] < 0
alors positif <- faux
fsi
i <- i+1
ftant
si positif
alors écrire("tableau d'entiers naturels")
sinon écrire("tableau d'entiers relatifs")
fsi
fin
Lexique :
- i : entier, indice d'itération
- n : entier, taille du tableau
- tab : tableau entier[0..n-1]
- positif : booléen, vrai si aucun entier négatif n'a été détecté
Qu’est ce que le parcours imbriqué ?
Certains algorithmes sur les tableaux font appel à des boucles imbriquées : la boucle principale sert généralement à
parcourir les cases une à une, tandis que le traitement de chaque case dépend du parcours simple d'une partie du
tableau (par exemple toutes les cases restantes), ce qui correspond à la boucle interne.
Exemple
La fonction suivante calcule, pour chaque case d'un tableau, le nombre de cases suivantes qui contiennent un
élément strictement supérieur. Les résultats sont placés dans un tableau.
fonction calculerNbSuccesseurSup(n : entier, t : tableau entier[0..n1]):tableau entier[0..n-1]
début
Pour i de 0 à n-2 faire
tres[i] <- 0
fpour
Pour i de 0 à n-2 faire
Pour j de i+1 à n-1 faire
18
CER SCHMITT Mathieu
si t[i] < tres[i]+1
alors tres[i] <- tres[i]+1
fsi
fpour
fpour
retourne tres
fin
Lexique :
- n : entier, taille du tableau
- t : tableau entier[0..n-1]
- tres : tableau entier[0..n-1],
nombre de cases
de t indice strictement
supérieur à t[i]
- i : entier, indice d'itération
remplir tres)
- j : entier, indice d'itération
restantes de t)
tableau résultat (case i contient le
supérieur à i qui contiennent un élément
de la boucle principale (parcours pour
de la boucle interne (parcours des cases
Tableaux multidimensionnels ?
Les cases d'un tableau à une dimension sont indicées de manière consécutive (cases "alignées"). Il est possible de
disposer ces cases selon des grilles (tableaux à deux dimensions), des cubes (tableaux à trois dimensions), ...
Les algorithmes les plus simples sur ces tableaux utilisent néanmoins en général des boucles imbriquées : chaque
niveau de boucle correspond au parcours selon une dimension.
Le type d'un tableau précise l'intervalle de définition selon chaque dimension.
tableau type_des_éléments[borne_inf_dim1 .. borne_sup_dim1, borne_inf_dim2 ..
borne_sup_dim2, ...]
OMFG, Tableaux à deux dimensions ? :S
Ces tableaux sont faciles à se représenter comme une grille (ou matrice) ayant un certain nombre de lignes
(première dimension) et un certain nombre de colonnes (seconde dimension).
tableau type_des_éléments[0..nb_lignes-1, 0..nb_colonnes-1]
Un tel tableau, avec 5 colonnes et 3 lignes, peut par exemple contenir les éléments suivants :
0
0
1
2
3
4
45
54
1
-56
22
19
CER SCHMITT Mathieu
1
64
8
54
34
2
2
56
23
-47
0
12
Pour accéder à un élément du tableau, il suffit de préciser entre crochets l'indice de la case contenant cet élément,
et ce pour chacune des dimensions. Par exemple, pour accéder à l'élément 23 du tableau d'entiers ci-dessus, on écrit
: t[2,1]. L'instruction suivante affecte à la variable x la valeur du premier élément du tableau, c'est à dire 45.
x <- t[0,0]
L'élément désigné du tableau peut alors être utilisé comme n'importe quelle variable :
t[2,1] <- 43
Cette instruction a modifié le tableau :
0
1
2
3
4
0
45
54
1
-56
22
1
64
8
54
34
2
2
56
43
-47
0
12
Exemple : calcul de la somme
fonction somme(li : entier, co : entier, t : tableau entier[0..li-1, 0..co1]):entier
début
s <- 0
Pour i de 0 à li-1 faire
Pour j de 0 à co-1 faire
s <- s + t[i,j]
fpour
fpour
retourne s
fin
Lexique :
- li : entier, nombre de lignes du tableau
- co : entier, nombre de colonnes du tableau
- t : tableau entier[0..li-1, 0..co-1], tableau dont on cherche l'élément
maximal
- s : entier, somme des éléments déjà parcourus
- i : entier, indice d'itération sur les lignes
- j : entier, indice d'itération sur les colonnes
Recherche dichotomique ? ( ake koi ????:/ )
20
CER SCHMITT Mathieu
La fonction rechercheDicho recherche un élément dans un tableau trié et retourne l'indice d'une occurrence de cet
élément (ou -1 en cas d'échec). Une telle recherche peut être réalisée de manière séquentielle ou dichotomique.
Nous développons ici la version dichotomique qui est la plus efficace en temps d'exécution.
On compare l'élément cherché à celui qui se trouve au milieu du tableau. Si l'élément cherché est plus petit, on
continue la recherche dans la première moitié du tableau sinon dans la seconde. On recommence ce processus sur la
moitié. On s'arrête lorsqu'on a trouvé ou lorsque l'intervalle de recherche est nul.
Exemples :
Exemple de recherche dans le tableau d'entiers suivant défini sur l'intervalle [3..10] :
Indices :
3
4
5
6
7
8
9
10
Valeurs :
5
13
18
23
46
53
89
97
Recherche de 46 :
Etape 1 : comparaison de 46 avec t[6] (6=(10+3)÷2), t[6]<46 => recherche dans [7..10]
Etape 2 : comparaison de 46 avec t[8], t[8]>46 => recherche dans [7..7]
Etape 3 : comparaison de 46 avec t[7], t[7]=46 => élément cherché trouvé à l'indice 7
Recherche de 10 :
Etape 1 : comparaison de 10 avec t[6], t[6]>10 => recherche dans [3..5]
Etape 2 : comparaison de 10 avec t[4], t[4]>10 => recherche dans [3..3]
Etape 3 : comparaison de 10 avec t[3], t[3]<10 => recherche dans [4..3], Borne inférieure supérieure à la borne
supérieure donc on met fin à l'algorithme et l'élément cherché n'a pas été trouvé !
Voyons l'implémentation de cette fonction :
fonction rechercheDicho(e : entier, n : entier, t : tableau entier [0..n1]):entier
début
debut <- 0
fin <- n-1
trouve <- faux
tant que debut <= fin et non trouve faire
i <- (debut+fin)÷2
si t[i] = e
alors trouve <- vrai
sinon si t[i] > e
alors fin <- i-1
21
CER SCHMITT Mathieu
sinon debut <- i+1
fsi
fsi
ftant
si trouve
alors indice <- i
sinon indice <- -1
fsi
retourne indice
fin
Lexique :
- e : entier, élément recherché
- n : entier, taille du tableau
- t : tableau entier[0..n-1], tableau trié par ordre croissant
- debut : entier, début de la zone de recherche
- fin : entier, fin de la zone de recherche
- trouve : booléen, faux tant que l'élément cherché n'est pas trouvé
- i : entier, indice de la case du milieu de la zone de recherche
- indice : entier, indice de l'élément recherché ou -1 s'il n'est pas
trouvé
Etudier quel est le rôle de l’offshore dans le texte
Que recouvre précisément le terme d'externalisation ?
Une vaste palette de services et de prestations en réalité... Tout d'abord l'infogérance, qui consiste à sous-traiter
partiellement ou complètement l'exploitation d'un système d'information. Le BPO ensuite (Business Process
Outsourcing), où des fonctions "métiers", par exemple la relation client ou la gestion des ressources humaines, sont
confiées à des spécialistes. La TMA enfin (Tierce maintenance applicative), qui assure la maintenance des
applications présentes dans l'entreprise ou développées par cette dernière. Sans oublier des formes plus hybrides
(co-sourcing) où clients et prestataires créent une structure commune pour gérer l'externalisation ou encore des
formes plus anciennes (mode ASP) où l'application est louée.
Offshore, nearshore, onshore... ?
Ces trois termes désignent d'une certaine manière l'éloignement du prestataire par rapport à son client. Avec
l'offshore, les prestataires se trouvent dans des pays très éloignés, tel que l'Inde ou la Chine, alors que dans le cas du
nearshore, ils se trouvent à proximité du client : au Maghreb par exemple pour les entreprises françaises voire, selon
certaines définitions, en France (en province par rapport à la région parisienne). L'onshore est une pratique qui
consiste à faire travailler chez le client du personnel venant des pays... offshore aux conditions de ces pays.
Sous quelles conditions pratiquer l'externalisation ?
Sous des conditions de contrat claires tout d'abord ! Il faut en effet prévoir très précisément les critères d'évaluation
22
CER SCHMITT Mathieu
de la qualité de la prestation ainsi que les modalités de leur évolution. Attention aussi à la dépendance vis-à-vis du
prestataire (perte d'expertise) et, le cas échéant, à la possibilité de faire marche arrière, tout en étant capable de
récupérer (développements, savoir-faire) ce qui a été confié pendant des mois ou des années à un tiers.
Pourquoi externaliser la maintenance de ses applications ?
Les demandes d'évolutions, de nouvelles interfaces ou de fonctionnalités additionnelles affluent parfois sans qu'on
puisse les gérer efficacement, au grand mécontentement des utilisateurs. L'enjeu pour l'entreprise est de toujours
rester au fait des bonnes pratiques et des normes en vigueur, tout en respectant les budgets décidés et en ne
perdant pas de vue que la maîtrise des développements effectués sur ses applications est un éléments clés de ce
type de contrat.
Pourquoi l'offshore suscite-t-il autant de controverse ?
L'externalisation offshore alimente régulièrement les colonnes de la presse pour plusieurs raisons. Il n'est dans un
premier temps pas aisé de confier des prestations à des sociétés implantées à plus de 15 heures de vol de son siège
social, les risques de non qualité (du fait du prestataire mais aussi de la mauvaise gestion du contrat par le client)
sont réels. Le recours à une main d'oeuvre à bas prix (pays low cost) suscite par ailleurs de vives polémiques dans les
pays passeurs d'ordre, notamment aux Etats-Unis où des visas spéciaux permettent à des salariés étrangers de
travailler aux conditions de rémunération de leur pays.
Comprendre la méthode SADT
L'acronyme S.A.D.T signifie : Structured Analysis and Design Technic. Cette méthode a été mise au point par la
société Softech aux Etats Unis. La méthode SADT est une méthode d'analyse par niveaux successifs d'approche
descriptive d'un ensemble quel qu'il soit. On peut appliquer le SADT à la gestion d'une entreprise tout comme à un
système automatisé
Position du SADT dans la gestion d'un projet :
23
CER SCHMITT Mathieu
Le SADT va permettre d'aider à la gestion d'un projet. Par son rôle d'analyse, il sera possible de l'utiliser à tous
niveaux de la conception du SA au codage (programmation du système automatisé).
Le SADT est avant tout un langage de communication. Cette communication se fait à différents niveaux. Au niveau
de l'élaboration du projet tout d'abord en permettant par son formalisme à chacun de participer, ensuite lors
d'explications à des intervenants extérieurs son formalisme permet à chacun d'appréhender le SA.
Objectifs d'une analyse S.A.D.T :
L'objectif de cette étude doit mener les intervenants (ingénieurs, techniciens, opérateurs) à un tout qui soit
cohérent et homogène avec le système à étudier.
Dans n'importe quel système automatisé, circulent un certain nombre de flux de données. Les flux les plus
caractéristiques sont :
- les flux de pièces : flux qui caractérisent la valeur ajoutée à un produit.
- Les flux d'informations : ces flux vont permettre à l'outil de production de pouvoir évoluer.
- Les flux énergétiques.
- les flux divers (copeaux, fluides de coupe, rejets divers, etc...).
L'analyse SADT va permettre d'organiser ces flux de données pour donner une vision globale du système puis par
une analyse des niveaux successifs, permettre de préciser de plus en plus finement le rôle de chacun des éléments
du système. La finesse de cette description dépendra directement des besoins des utilisateurs.
24
CER SCHMITT Mathieu
Exemple :
Soit un système automatisé
produisant des entretoises. Les flux
que l'on peut identifier au niveau le
plus haut de la description sont :
- les flux de pièces (les entretoises,
qui sont les pièces finies et les tubes
qui sont les pièces brutes)
- le flux d'énergie (électricité)
- les flux d'informations
(informations de contrôle et
réglages)
- les flux divers (copeaux)
Le niveau ci-dessus est le niveau le plus global. Il est nécessaire pour définir plus complètement le système
d'affiner l'analyse pour comprendre le fonctionnement de ce système automatisé. Si on imagine que l'on puisse
"rentrer" dans le rectangle "Produire des entretoises"(nous appellerons ce rectangle "Boîte"), la description de
l'unité de production serait alors un peu plus précise et permettrait de situer les différents intervenants de ce
système.
25
CER SCHMITT Mathieu
Dans cette boîte, la décomposition du système automatisé se fait plus fine et le rôle de chacun des éléments de
l'unité de production y est décrit avec plus de précision.
Par exemple, l'automate PB80 a pour objet de donner des ordres au pré-actionneurs, de veiller au respect des
consignes données aux actionneurs et se sont les actionneurs qui fabriquent les entretoises.
Chaque boîte possède un numéro qui lui est propre (A1, A2, A3, et A4).
Intéressons nous maintenant à la boîte A4, "Fabriquer des entretoises".
26
CER SCHMITT Mathieu
La décomposition se fait de plus en plus précise. A ce niveau, les éléments de l'unité de production apparais- sent.
Le parcours des pièces en cours de fabrication se précise.
1/ Les tubes sont tronçonnés en pièces,
2/ les pièces transférées jusqu'à l'unité de lamage chanfreinage,
3/ Elles sont lamées et chanfreinées,
4/ De nouveau transférées jusqu'à l'unité de nettoyage,
5/ Nettoyées,
6/ Les pièces terminées et lavées sont alors évacuées
On pourrait continuer à descendre les niveaux jusqu'à obtenir le degré de précision souhaité pour la description
du système. Il est possible de descendre encore loin dans la finesse de description du système mais ce n'est pas
l'objet de cette présentation.
Actigrammes - Datagrammes
Dans une analyse SADT, on peut modéliser deux types d'analyse. L'analyse par des actigrammes (boîtes d'action)
et l'analyse par des datagrammes (boîtes de donnée).
Sur des actigrammes, les actions sont reliées entre elles par des flux de données alors que les datagrammes se sont
les données qui sont reliées entre-elles par des flux d'activité.
Remarque : dans l'exemple proposé précédemment nous ne nous sommes intéressés qu'aux actigrammes. Les
datagrammes ne seront pas traités dans cette série.
27
CER SCHMITT Mathieu
Exemples :
Actigramme

Datagramme
Formalisme du S.A.D.T :
Si nous reprenons l'exemple précédent un certain nombre de symboles et de notations sont utilisés.
Niveaux : On parle de niveau d'analyse pour situer la position de l'étude. Le niveau le plus haut est le niveau A-0. Le
niveau le plus bas dans notre exemple est le niveau A4.
Boîtes : elles sont les constituants de la décomposition. La première boîte est placée en haut et à gauche du niveau
décrit. Au dessus et à gauche de la deuxième boîte et ainsi de suite. Chaque boîte est numérotée. Les boîtes de
l'actigramme A0 sont numérotées de A1 à A4, les boîtes de l'actigramme A4 sont numérotées de A41 à A44. Si on
entrait dans la boîte A42, les numéros des boîtes seraient notées A421 à A42x.
Flèches : liaison entre les boîtes. Une flèche est représente un ensemble de données.
Flèches à double sens : elles visualisent le flot de données dans les deux sens. Un point est mis sur le côté droit ou
en dessous pour rappeler qu'elle est bi-directionnelle. Les deux flux (flux allé et flux retour) sont séparés par le signe
/. Ces flèches ont pour but de faciliter la lecture de l'analyse.
Codes MECS : Les codes MECS, Mécanismes, Entrées,
Contrôle, Sorties, sont placés près de l'extrémité de la
flèche concernée pour identifier le rôle de la flêche
dans la description, accompagnée d'un chiffre
identificateur. En général on place un code MECS sur
des flux entrants ou sortants du niveau décrit.
Dans l'exemple précédent, on peut voir les différents
codes mecs associés à la boîte A41. Le mécanisme
permettant de tronçonner est l'unité de tronçonnage
"M1".
28
CER SCHMITT Mathieu
Parenthèses : on place des parenthèses à l'extrémité non
fléchée d'une flèche, pour une donnée d'un niveau de détail
particulier qui n'apparaît pas sur le diagramme père mais
qui est visible sur le diagramme fils. On appelle
diagramme père le niveau supérieur d'un niveau donné et
le diagramme fils, le niveau inférieur d'un niveau donné.
On place des parenthèses à l'extrémité fléchée d'une flèche,
pour une donnée existant implicitement sur toutes les
boîtes des diagrammes fils mais n'y apparaissant pas. Ces
parenthèses figurent uniquement sur le diagramme père.

Conclusions :
a) Le SADT est un outil graphique de représentation.
b) Le SADT oblige à consigner par écrit les décisions d'une équipe de travail. Ceci permet progressivement de créer
une documentation complète.
c) Le SADT est un travail d'équipe qui demande discipline et coordination. Le SADT est un produit pour communiquer
et pour être diffusé.
d) Son formalisme conduit à une représentation structurée ascendante ou descendante.
e) Si le SADT est utilisé complètement (Actigrammes et Datagrammes) il permet de programmer directement un
système automatisé. Une MOCN (Machine Outil à Commande Numérique) peut être programmée directement en
SADT.
f) Si nous reprenons l'exemple précédent pour avoir une vision globale de l'ensemble, les niveaux étudiés
s'enchaînent les uns sur les autres de la façon suivante :
29
CER SCHMITT Mathieu
Réponse aux problématiques
-
Comment formaliser le problème de l’entreprise ? Cf. ci-dessus
Comment se faire comprendre par tout le monde grâce à l’algorithmique ? Cf. ci-dessus
Réponse aux hypothèses
VRAI. L’algorithmique est la structure des langages de programmation
VRAI. L’algorithmique permet de s’adapter à de nombreuses typologies
FAUX. L’algo permettra de poser les 1ères règles de communication entre MD et ses partenaires
FAUX. La fiche descriptive de module code est en fait un dictionnaire pour l’algorithmique
Difficultés rencontés
-
Comment se limiter dans les connaissances sur l’algo
Termes techniques
Trackmania xD lol
30
CER SCHMITT Mathieu
-
Comprendre SADT et en faire une approche informatique
Synthèse
Ce prosit constitue un des prosit les plus importants de l’année dans la mesure où il jette les bases communes à tous
les langages, l’algorithmique. Il est donc important de s’y atteler.
Par ailleurs, l’offshoring, à mon goût ne constituait pas un point essentiel pour ce prosit, une simple définition aurait
suffit.
31
CER SCHMITT Mathieu
Bibliographie
Documents officiels :
http://www.lsis.org/~dea/M6optionD/Exp-GL41-SADT.pdf : Comprendre les SADT.
http://www-ipst.u-strasbg.fr/pat/autom/grafcet.htm : kesk’ un grafcet
http://www.merictech.info/articles.php?lang=fr&pg=124 : Aide à l’algorithmique
http://www.journaldunet.com/solutions/dossiers/pratique/externalisation.shtml : Comprendre l’externalisation
http://stic.cnam.fr/bioinfo/cours_algo_bnf103.pdf : Etudier les bases de l’algo.
http://www.offshore-developpement.com/sommaire.php3 : Définir l’offshoring
Documents officieux :
Wikipedia : Définir les mots clés
http://julp.developpez.com/algo/Instructions-et-types-elementaires/ : Etudier les bases de l’algo.
file:///C:/Program%20Files/CommentCaMarche/algo/algointro.htm : Etudier les bases de l’algo.
ftp://ftp.inria.fr/INRIA/publication/publi-pdf/RR/RR-0471.pdf : Thèse sur l’algo parallèle.
http://www.wikituto.org/index.php/Algorithme:Intro#D.C3.A9finition : Tuto sur l’algo.
32
Téléchargement