\documentclass[a4paper,10pt]{article}
\usepackage{myXsim}
\usepackage{minted}

\author{Benjamin Bertrand}
\title{Recheche par dicotomie et complexité - Cours}
\date{Mars 2023}

\pagestyle{empty}

\begin{document}

\maketitle

\section{Complexité}

\begin{definition}[Ordre de complexité]
    On dit qu'un algorithme est d'une \textbf{compléxité de l'ordre de $f(n)$} si il existe une constante positive K telle que, quelle que soit la taille n de l'entrée, le nombre d'opérations élémentaires est plus petit que $K \times f(n)$.

    On dit alors que l'algorithme est en $\mathcal{O}(f(n))$.
\end{definition}

\section{Etude de la complexité}

\begin{enumerate}
    \item Recherche du maximum d'une liste
        \begin{multicols}{2}
            \inputminted[bgcolor=base3]{python}{./algos/1B_max.py}

            Calcul de la compléxité
        \end{multicols}
    \item Moyenne
        \begin{multicols}{2}
            \inputminted[bgcolor=base3]{python}{./algos/1B_max.py}

            Calcul de la compléxité
        \end{multicols}
    \item Table de multiplication
        \begin{multicols}{2}
            \inputminted[bgcolor=base3]{python}{./algos/1B_table.py}

            Calcul de la compléxité
        \end{multicols}
    \item Recherche par dichotomie
        \begin{multicols}{2}
            \inputminted[bgcolor=base3]{python}{./algos/1B_dicho.py}

            Calcul de la compléxité
        \end{multicols}
\end{enumerate}


\section{Les complexités courantes}

Dans la pratique, on ne choisira que des fonctions $f(n)$ simples prise dans la liste suivante (classé par ordre croissant de rapidité):

\begin{itemize}
    \item $\mathcal{O}(1)$: complexité constante. Le temps d'exécution est indépendant de $n$ (la taille de l'entrée).

        \textbf{Exemples}:

    \item $\mathcal{O}(log(n))$: complexité logarithmique. Le temps d'exécution augmente d'une quantité constante quand la taille de l'entrée ($n$) est doublée.

        \textbf{Exemple}:

    \item $\mathcal{O}(nlog(n))$: complexité linéaire. Le temps d'exécution est proportionnel à la taille de l'entrée ($n$)

        \textbf{Exemples}:

    \item $\mathcal{O}(n^2)$: complexité quadratique. Le temps d'exécution est multiplié par 4 quand la taille de l'entrée est multipliée par 2.

        \textbf{Exemples}:

    \item $\mathcal{O}(n^k)$: complexité polynomiale. Le temps d'exécution est majoré par un polynôme de la taille d'entrée.

        \textbf{Exemples}:

    \item $\mathcal{O}(k^n)$: complexité exponentielle. Le temps d'exécution croit trop rapidement pour que la taille d'entrée puisse être grand.

        \textbf{Exemples}:
\end{itemize}

\paragraph{Temps d'exécution en fonction de la taille d'entrée}~

\begin{center}
    \includegraphics[scale=0.9]{./fig/complexite}
\end{center}

\end{document}
