Aller au contenu

Algorithmie

L'optimisation des algortihmes possède deux composantes :

  • temps. Cela correspond aux nombres d'opérations.
  • mémoire allouées. Cela correspond aux nombres de bits (caratères = 1 byte, un entier = 4 bytes et un décimal = 8 bytes).

Note

1 byte = 8 bits

Notation

  • if condition si.
  • while condition do tant que c'est vrai, la boucle est appliquée.
  • for i from 1 to n-1 do

Calcul de la complexité

Le calcul de la complexité consiste à calculer les fonctions de coût associés à un algorithme.

Notation de dominance

La notation de dominance consiste à comparer le taux d'accroissement.

\(g\) domine \(f\) ie \(f \in O(g)\) si pour tout \(n \gt n_0\), il existe une constante \(c\) telle que \(f(x)\lt c \cdot g(x)\).

Note

Si la dominance est réciproque alors on note \(f \in \Theta(g)\) et inversement.

Note

Pour déterminer la complexité d'un algorithme il peut être simple encadrer la complexité de l'agorithme. Exemple \(1 \lt \frac{1}{2^0} + \frac{1}{2^2}+ \frac{1}{2^4} + ... \lt \Sigma \frac{1}{2^k} = 2\)

Algorithme de tri

Quatre algorithmes principaux pour le tri :

Algorithme Complextité spaciale Complexité temporelle
Par sélection 1 \(n^2\)
Par insertion 1 \(n \log n\)
Fusion n \(n \log n\)
Rapide \(n^2\)

Note

Trier les données avant de les utiliser peut permettre de diminuer la complexité.

Tri par sélection

SelectionSort(A: array of n integers)
    i, j, posmin : integer

    for i from 0 to n-2 do
        posmin = i
        for j from i+1 to n-1 do
            if (A[j] < A[posmin]) then
                posmin = j
            swap(i, j) // échange de place les deux éléments

Tri par insertion

InsertionSort(A:array of n integers)
    i, j: integer

    for i from 1 to n-1 do
        j = i
        while (j > 0 and A[j] < A[j-1]) do
            swap(A[j], A[i])
            j = j-1

Tri Fusion

Utilise le principe de récursivité. Le tableau est partagé en deux et le tri est appliqué sur les deux parties.

MergeSort (A: array of n integers; begin, end: integer)
    m: integer // variable for the middle position

    if (end - begin > 1) then // |A|<2, nothing to do
    m = (begin + end)/2 // the middle position
    MergeSort(A, begin, m) // sort left half
    MergeSort(A, m, end) // sort right half
    Merge(A, begin, m, end) // merge sorted halves
Merge (A: array of n integers; b, m, e: integer)
    L: array of m-b integers
    R: array of e-m integers
    i,j,k: integer

    // copie des éléments dans deux tableaux séparés
    for k from b to m-1 do
        L[k-b] = A[k] //copy A[b],...,A[m-1] in L

    for k from m to e-1 do
        R[k-m] = A[k] //copy A[m],...,A[e-1] in R

    i = 0
    j = 0

    // si les éléments sont 
    while (i < m-b) and (j < e-m) do //the loop with the comparisons
        if (L[i] <= R[j]) then
            A[k] = L[i]
            i = i+1
        else
            A[k] = R[j]
            j = j+1
        k = k+1

    // copier les éléments restant lorsqu'un des tableaux est vide
    while (i < m-b) do //if there are still elements of L to copy
        A[k] = L[i]
        i = i+1
        k = k+1

    while (j < e-m) do //if there are still elements of R to copy
        A[k] = R[j]
        j = j+1
        k = k+1

Trie rapide

QuickSort(A:array of n integers; begin, end: integer)
    indexpivot: integer

    if (end-begin > 1) then
        indexpivot = ChoosePivot(begin, end)
        indexpivot = Partition(A, begin, end, indexpivot)
        QuickSort(A, begin, indexpivot)
        QuickSort(A, indexpivot+1, end)
Partition(A:array of n integers; begin, end, indexpivot : integer): integer
    i, j: integer

    swap(A[begin] , A[indexpivot])// swap the pivot with the first element
    A[indexpivot] = tmp
    i = begin + 1 // position the two cursors
    j = end - 1
    while (j>i) do
        if A[i] < A[begin] then
            i=i+1
        else if A[i-j] > A[begin] then
            j = j-1
        else // if you get here, A[i] and A[j] must be swapped
            swap(A[i], A[j])
            i = i+1
            j = j-1

    swap(A[begin], A[j]) // final swap to put pivot in final positon
    return(j)

Fonctions récursives

Les fonctions récursives sont des fonctions qui s'appellent à eux mêmes.

fct_recursive(input)
    if condition 
        return valeur
    else
        return fct_recursive(input-1)