Notes pour l'examen intra - IFT-2008

Notes pour mon étude. À relire juste avant l'examen

09 h 00 à 11 h 50
235, rue Saint-Jacques (Cégep de Granby)
Local A-204

Feuille de note

Efficacité des algorithmes

Se mesure par la quantité de ressources utilisées

Ressources :

Approche Empirique

Consiste à essayer l'algorithme sur différent jeux de données bien choisis

Avantages :

Inconvénients :


Approche Algorithmique

Le coût d'exécution d'un algorithme est défini par le nombre d'opérations élémentaires effectuées durant son exécution

Une opération élémentaire est une opération non divisible

Avantages :

Inconvénients :


Notation (big) O

Détermine une borne supérieure éventuelle

Transitif, ce qui veut dire que si

𝑓(𝑛) ∈ 𝑂(𝑔(𝑛))

et

g(𝑛) ∈ 𝑂(ℎ(𝑛))

alors

𝑓(𝑛) ∈ 𝑂(ℎ(𝑛))

Définition formelle : 𝑓(𝑛) ∈ 𝑂(𝑔(𝑛)) s’il existe deux constantes positives 𝑛0 et 𝑐 tel que 𝑓(𝑛) ≤ 𝑐𝑔(𝑛) pour tout 𝑛 ≥ 𝑛₀.

MEANING

On dit que 𝑓(𝑛) ∈ O(𝑔(𝑛)) si 𝑓(𝑛) est bornée supérieurement par une fonction proportionnelle à 𝑔(𝑛) à partir d’un certain seuil 𝑛₀.

Décomposition :

Interprétation :

La notation Big-O donne une estimation supérieure de la croissance de 𝑓(𝑛). Si 𝑓(𝑛) ∈ O(𝑔(𝑛)), alors 𝑔(𝑛) représente un majorant asymptotique de 𝑓(𝑛).

Exemple :

Si 𝑓(𝑛) = 5𝑛² + 3𝑛 + 2, alors on peut dire que 𝑓(𝑛) ∈ O(𝑛²) parce qu’il existe des constantes 𝑐 et 𝑛₀ telles que :

5𝑛² + 3𝑛 + 2 ≤ 𝑐𝑛²

pour un 𝑐 suffisamment grand et pour 𝑛 ≥ 𝑛₀.

Cela signifie que 𝑓(𝑛) a une croissance au plus quadratique pour les grandes valeurs de 𝑛.

Notation Ω (omega)

Détermine une borne inférieure éventuelle

AKA

Same shit, but inverted

Notation Θ (thêta)

Définition formelle : 𝑓(𝑛) ∈ 𝛩(𝑔(𝑛)) s’il existe trois constantes positives 𝑛₀, 𝑐₁, 𝑐₂ tel que

𝑐₁𝑔(𝑛) ≤ 𝑓(𝑛) ≤ 𝑐₂𝑔(𝑛)

pour tout 𝑛 ≥ 𝑛0.

Donc 𝑓(𝑛) ∈ 𝛩 𝑔(𝑛) si et seulement si f(𝑛) ∈ O(𝑔(𝑛)) et f(𝑛) ∈ Ω(𝑔(𝑛))

Notations graphique

Basiquement, doit avoir le même "𝑔" et "𝑛" pour les deux autres notations, les "c" peuvent changer tho

Opération baromètre

Le temps d'exécution d'un algorithme = Nombre d'opérations élémentaires pour accomplir sa tâche

On ne cherche pas un chiffre précis, mais plutôt l'ordre de croissance, aka à quel point la taille de "𝑛" influence le temps d'exécution

Il suffit donc d'identifier une opération baromètre et de compter le nombre de fois que cette opération est effectuée en fonction de "𝑛"

L'opération baromètre est une opération élémentaire qui, à une constante près, est effectuée au moins aussi souvent que n’importe quelle autre opération élémentaire de l’algorithme.

Opérations baromètres

Les flèches rouges sont invalides :

Classes de complexité

Classe de complexité

Structures de donnée de base

Matière skippée dans les notes

Je saute par dessus toutes les structures de données de base puisque cette matière est déjà maîtrisé.

Je devrais revenir en arrière pour compléter cette documentation.

Graphes

Tout plein de points qu'ont relies ensemble (yeah)

Orienté : Les flèches ont un sens

Non orienté : Les liens sont bidirectionnels

Même chose à un détail prêt :

Définitions

Adjacent : Un noeud adjacent à un autre veut dire qu'un arc existe entre les deux

Chemin : Une suite de noeuds dans laquelle chaque paire de noeuds consécutifs est liée par un arc

Degré (ou arité) :

Cycle : Un chemin dont l'origine est la même que la destination

Boucle : Cycle constitué d'un seul arc (sommet pointe sur lui-même)

Graphe acyclique : Graphe ne contenant aucun cycle

Puits : Noeud dont l'arité de sortie est 0

Source : Noeud dont l'arité d'entrée est 0

Graphes pondérés

Comme un graphe normal, mais chaque arc (u, v) possède une valeur numérique w(u, v)

Les graphes orientés et pondérés sont souvent appelés des réseaux

Graphe pondéré

Exemple : l'arc (4, 3) possèe un poids de 0.75, soit w(4, 3) = 0.75

Longueur de chemin

La somme des poids des arcs constituant ce chemin.

Synonyme dans cette situation :

On peut donc trouver le plus petit chemin, ou encore le plus grand

Graphe connexe

Un graphe non orienté est connexe si et seulement si il existe un chemin etre n'importe quelle paire de sommets distincts du graphe

Aka, aucun sommet n'est isolé, il est possible de se rendre partout à partir de n'importe ou

Composante connexe : Le graphe n'est pas connexe, on se retrouve avec des sous-graphes connexes. Chaque sous-graphe est une composante connexe

Dans un graphe orienté, on parle plutôt de

Graphe avec composante fortement connexe

Arbre

Arbre

Un arbre est un graphe orienté, acyclique, faiblement connexe avec :

Matrice de noeuds adjacents

Matrice d'adjacence

Définie par :

Exemple de matrice d'adjacence

Avantages :

Inconvénients :

Arité de sortie : Il suffit d'additionner une rangé pour avoir le degré de sortie

Arité d'entrée : Même chose, mais avec les colonnes

Matrice de valuation

Basiquement la même chose que la matrice d'adjacence, mais à la place de simplement mettre un "1" dans la matrice lorsque le lien existe, on met le poid de l'arc.

Exemple de matrice de valuation

Définition formelle :

Liste d'adjacence

Exemple d'un graphe non valué :

Exemple de liste d'adjacence non valué

Exemple d'un graphe valué :

Exemple de liste d'adjacence valué

On ne fait que rajouter une boîte contenant le poids de l'arc

Forces et faiblesses

Forces

Faiblesses

Conclusion

Le choix de l’implémentation (entre liste ou matrice) se fait donc en fonction de ces compromis.

Le plus souvent, c’est la liste de successeurs qui est préférable.

Parcours d'un graphe

De nombreux algorithmes relatifs aux graphes nécessitent une procédure qui permet l'examen systématique des noeuds d'un graphe, une et une seule fois

Possibilité de présence de cycles, alors il faut marquer les noeuds déjà visités pour éviter de revenir continuellement sur les mêmes noeuds

Parcours en profondeur (Depth-First Search: DFS)

Algorithme :

  1. Initialiser (mettre à faux) une marque associée à chaque noeud
  2. Empiler et marquer (à vrai) le noeud de départ
  3. Tant et aussi longtemps que la pile n'est pas vide :

Remarques

Parcours en largeur (Breadth-First Search: BFS)

Basiquement la même chose, mais avec une file plutôt qu'une pile

Algorithme :

  1. Initialiser (mettre à faux) une marque associée à chaque noeud
  2. Enfiiler et marquer (à vrai) le noeud de départ
  3. Tant et aussi longtemps que la file n'est pas vide :

Algorithmes de parcours de graphe

Kosaraju

TODO

Dijkstra

Principe : Approche gloutonne

Ne fonctionne qu'avec des poids positifs

Algorithme :

  1. Initialisation
  2. Sélectionner le sommet non traité avec la plus petite distance connue
  3. Mettre à jour les distances des voisins (relâchement)
  4. Répéter jusqu'à ce que tous les sommets soient traités

Relâchement : Calculer la distance de tous les sommets voisins

Complexité :

Ballman-Ford

Pincipe : Itérations successives de relâchement des arêtes

Gère les poids négatifs (mais pas les cycles négatifs)

Algorithme :

  1. Initialisation
  2. Répéter n - 1 fois : relâcher toutes les arêtes
  3. Vérifier la présence de cycles négatif

Complexité :

Floyd / Warshall

TODO


Retour