Pardon :
Mesures de complexité d’un algorithme
Remarques préliminaires
Pour répondre à ces question
questions
Pire des cas
Il s’agit de donner une borne supérieure du nombre d’étapes nécessaires à la terminaison de l’algorithme sur l’ensemble des instances du problème qu’il résout.
"sur l’ensemble des instances" me semble incorrect. Il faut fixer leur taille, comme tu le fais dans la formule qui suit, sinon on risque de ne pas avoir de borne supérieure dans $\mathbf N$.
De manière formelle, la complexité d’un algorithme dans le pire des cas est défini par :
Centrer la formule ?
Dire que l’algorithme A a une complexité dans le pire des cas de O(n2) veut dire
Ne devrais-tu pas préciser que c'est asymptotique, i.e. quand $n$ tend vers l'infini ?
De plus, ne centrerais-tu pas la formule ?
Il faut comprendre que si Tmax est un nombre exact du nombre d’opérations
"le nombre exact"
Tu n'as pas défini Tmax, seulement Tmax(n).
grandit avec la taille du problème: on parle
Espace
Meilleur des cas
par rapport à la notion dans le pire des cas :
Centrer la formule ?
c’est-à-dire comme le minimum du nombre d’étapes pour résoudre une instance parmi toutes les instances
Là encore, tu parles de "toutes les instances" mais tu précises leur taille dans la formule.
Étude de l’encadrement sur exemple
Remarquons par exemple que l’algorithme A possède un nombre minimal d’opérations qui dépend de la taille de l’instance
On ne voit pas trop où est fmin.
Enfin, l’algorithme B possède un comportement oscillant pour sa borne supérieure
Are you sure?
et ce, quel que soit la plage de valeurs
quelle que soit
Dans le cas de l’algorithme A, l’estimation asymptotique est une borne supérieure au nombre d’opérations, et ce, quel que soit la plage de valeurs de la taille des instances considérées. Dans le cas de l’algorithme C, on dispose également de deux plages différentes de taille d’instances, ce qui nous permettra de visualiser certains défauts de la complexité asymptotique pour l’évaluation pratique de la performance des algorithmes.
Les deux phrases n'ont pas le même rôle : la première analyse le graphe de $A$ tandis que la seconde est une simple indication. Je ferais comme ça :
Voyons maintenant les différences qu’il peut exister entre la complexité exacte et la complexité asymptotique. Les cinq images suivantes montrent le tracé de la complexité exacte et asymptotique en fonction de la taille des instances. Dans le cas de l’algorithme C, on dispose également de deux plages différentes de taille d’instances, ce qui nous permettra de visualiser certains défauts de la complexité asymptotique pour l’évaluation pratique de la performance des algorithmes.
Pour l’algorithme A, on constate sur la figure suivante que l’estimation asymptotique est une borne supérieure au nombre d’opérations, et ce, quel que soit la plage de valeurs de la taille des instances considérées.
C’est ce que l’on peut observer sur les deux figurent
figures
et qui représente l’écart relatif entre le nombre d’opérations
représentent
si l’on considère que l’utilisateur de l’algorithme B ou C ne va avoir à traiter en pratique que des instances de taille comprise entre 0 et 100, alors on peut voir que l’algorithme est très loin de se comporter comme le prédit la complexité asymptotique.
La phrase est lourde. Plutôt :
en supposant que l’utilisateur de l’algorithme B ou C ne va avoir à traiter en pratique que des instances de taille comprise entre 0 et 100, on peut voir que l’algorithme ne se comportera pas du tout comme le prédit la complexité asymptotique.
peut être largement faussée, tout comme la comparaison entre deux algorithmes a priori
à priori
L’importance de la constante multitplicative
multiplicative
avec pour effet de rendre la comparaison d’algorithmes impossible à priori comme nous le verrons par la suite
à priori (pas d'italique)
Complexité en moyenne
Cependant, cet encadrement atteint ses limites assez rapidement.
Le "cependant" ne va pas avec les critiques que tu fais juste au-dessus.
Malgré tout, on remarque très souvent qu’en pratique ces cas pathologiques n’arrivent que rarement si ce n’est jamais, et l’on peut munir l’espace
Ca va un peu vite. Je ferais plutôt un truc du genre :
Malgré tout, on remarque très souvent qu’en pratique ces cas pathologiques n’arrivent que rarement si ce n’est jamais. Pour prendre en compte cela, on peut munir l’espace
Le sous-ensemble des instances pratiques dépend de la configuration de l’exploitation de l’algorithme.
Plutôt :
Pour un même algorithme, le sous-ensemble des instances pratiques dépend de la configuration de l’exploitation qu'on en fait.
elles peuvent ne pas avoir les mêmes cas à traiter en règle générale
Plutôt que "cas", je mettrais "types d'instances".
pour déterminer le plan pour les livraisons de leurs livres
afin de déterminer
et [b1,b2]⊂N avec a priori
pour le libraire
à priori
b2<a2 qui traduit
b2<a2, pour traduire
Dans le cas du nombre de clients, il est probable que le nombre de commandes du libraire soit bien plus variable au sein de sa plage que celui d’Amazon
Je ne comprends pas le "Dans le cas du nombre de clients". Il manque un "même", non ? Le cas échéant, je préciserais : "même nombre de clients à livrer". Sinon, s'il y a le même nombre de clients en tout, la suite ne va pas.
Ainsi la distribution du nombre de clients par jour suivra peut-être quelque chose qui ressemble à une loi normale
Pour Amazon
Partant du principe que les instances pathologiques sont souvent exclues du sous-ensemble des instances pratiques ou suffisamment rares en son sein pour ne pas être considérées comme significatives, on s’intéresse à la complexité en moyenne d’un algorithme.
J'insisterais en disant, en évitant les répétitions de termes, que la complexité en moyenne est relativement fiable du fait de l'absence des cas pathologiques, la moyenne étant sensible aux valeurs extrêmes. C'est en gros ce que tu dis, mais je pense que ce n'est pas assez clair.
mais d’émettre une hypothèse sur la distribution de probabilité d’apparition des instances possibles
Ca fait bizarre de lire ça, parce que tu as déjà parler d'une mesure de probabilité quelques paragraphes auparavant. Du coup, on a un peu du mal à suivre le raisonnement. On a l'impression que tu introduis la complexité en moyenne dans ce paragraphe alors que tu le fais depuis le début, avec Amazon et compagnie. Je dirais donc un truc du genre :
Cela s'appelle la complexité en moyenne. Elle est relativement fiable parce que les cas pathologiques ont été dégagés par la mesure de probabilité. La complexité en moyenne n'est pas, comme on pourrait le penser, une moyenne du nombre d'opérations blablabla.
Supposons une mesure de probabilité μ
Plutôt "Définissons", non ?
Alors la complexité moyenne est definie par :
Je centrerais bien la formule.
Sinon, cette espérance ne m'est pas très naturelle, ayant l'habitude de ne travailler qu'avec des variables alétoires. C'est quoi $T(\Pi)$ ?
Dans le cas où Π est un ensemble discret
Je centrerais les formules qui suivent et mettrais l'indice de la somme sous la somme.
Par exemple si l’on génère de manière aléatoire des tableaux à trier, où chaque case sera remplie selon une même loi uniforme, alors toutes les instances auront même probabilité
Euh… toutes les instances de même taille, non ?
Les résultats en moyenne seront bien différents
Le "en moyenne" fait bizarre. De plus, "bien différents" de quoi ? De la complexité en moyenne ? Mais pour quelle mesure de probabilité ?
ou bien sûr les capacités globales
"sur" ?
Cela rajoute un élément à l’objet dont on cherche à caracteriser
caractériser
Analyse amortie
Mais d’une part, on peut retarder le besoin d’une nouvelle allocation en initialisant notre tableau avec une capacité qui est la taille estimée nécessaire pour notre application. Et d’autre part
Faire deux phrases ne va pas très bien parce que le "d’autre part" est également rattaché au "mais".
Pour définir la complexité amortie, il faut définir le coût amorti de chaque opération :
C'est quoi $n$ ?
Le paragraphe suivant n'est pas très clair non plus. Tu devrais préciser cela : "allouer n cases contiguës en mémoire est un O(n) mais permet d'effectuer par la suite n opérations en O(1). On définit alors le coût amorti…".
Les trois figures suivantes illustrent le nombre nécessaire d’opérations à 10 insertions en partant d’un tableau vide
Pas seulement. On a aussi le nombre d'opérations nécessaires pour 1, 2, 3… insertions.
J'ai toujours du mal avec ces graphes. Déjà, on distingue très mal les légendes. Et je ne comprends pas le second graphe. En fait, l'expression "nombre d'opérations" n'est pas très claire. Est-ce le nombre total d'opérations ou est-ce le nombre d'opérations pour insérer un nème élément ?
Je penses que tu devrais essayer de représenter ça sous forme d'un tableau.
Ajout de 1 :
Elements dans le tableau |
Nombre d'opérations pour insérer l'élément |
Capacité totale |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
3 |
3 |
Ajout de 3 :
Elements dans le tableau |
Nombre d'opérations pour insérer l'élément |
Capacité totale |
1 |
1 |
3 |
2 |
1 |
3 |
3 |
1 |
3 |
4 |
4 |
6 |
Multiplication par 2 :
Elements dans le tableau |
Nombre d'opérations pour insérer l'élément |
Capacité totale |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
3 |
4 |
4 |
1 |
4 |
exponentielles, c’est à dire qu’elles sont mal adaptées
c'est-à-dire
Bien souvent, l’amélioration de l’analyse amortie se fait par des heuristiques
Le lien merde, mais je crois que c'est un bug du Markdown. Ce n'est pas le seul lien qui pose problème.
par exemple dans le cas du tableau dynamique, on a en pratique en permanence une occupation mémoire qui n’est pas nécessaire
par exemple, dans le cas du tableau dynamique, on a en pratique en permanence une occupation mémoire qui n’est pas nécessaire
disjointes. Elle possède deux opérations:
Espace
Union-Find est une structure de données utile pour maintenir une partition d’un ensemble en classes disjointes.
L'article de Wikipédia n'est pas très explicite, ainsi je donnerais des détails là-dessus. Il est dit qu'on a un ensemble d'éléments et qu'on veut le partitionner. Dans le cas où cet ensemble est représenté par un liste, ça me semble trivial, non ? Je ne vois pas comment on se sert d'Union-Find en pratique. Un exemple simple serait le bienvenu.
tandis que la complexité dans le pire des cas reste la même ou augmente même.
reste la même voire augmente.
De prime abord, la différence entre l’analyse amortie et l’analyse en moyenne peut ne pas sembler flagrante. Je me permets donc d’insister sur ce qui fait la différence
Petite répétition.
Analyse lisse
Si la complexité en moyenne a été introduite pour pallier certaines
pallier à
Dans le cas ou σ tend vers l’infini
où
la complexité lisse a pour but d’être une synthèse permettant d’outrepasser les limitations des mesures de complexité précédentes et notamment en expliquant pourquoi certains algorithmes restent efficaces en pratique contrairement aux études théoriques effectuées jusque-là.
Je ne comprends pas en quoi l'analyse lisse permet de faire ça. Plus généralement, la partie sur l'analyse lisse n'est pas simple à assimiler.
qui est un domaine très courant dans le domaine de la simulation numérique
Répétition
de faire ressortir une distance entre deux instances et de fait
et, de fait
il devient alors impossible d’utiliser l’analyse lisse
Le "alors" ne répéterait-il pas le "de fait" ?
Les défauts de la complexité pour la comparaison d’algorithmes
La complexité algorithmique asymptotique possède un certain nombre de defauts
défauts
(et même en dehors cela peut être vrai)
(et parfois même en dehors)
Si dans la partie précédente nous avons mis en avant qu’il existe
"le fait qu'il existe" ?
ici on met en avant le fait qu’un algorithme
"met en avant" fait répétition.
et que si je sais a priori que la majorité des instances
donc si
à priori
Pire, même une étude précise pourra être mise en défaut et ce d’autant plus facilement que les deux algorithmes comparés offrent une complexité proche, par l’évaluation empirique.
Pire, même une étude précise pourra être mise en défaut par l’évaluation empirique, et ce d’autant plus facilement que les deux algorithmes comparés offrent une complexité proche.
Plus les systèmes deviennent complexes, de même que les algorithmes ou les problèmes qu’ils résolvent et
Plus les systèmes deviennent complexes, de même que les algorithmes ou les problèmes qu’ils résolvent, et
Il y a beaucoup de notions donc je pense que c'est normal, mais on peine à prendre du recul par rapport à tout ça. Autant je comprends comment est construite chacune des complexités, autant je ne parviens pas à les comparer et à voir à quoi elles servent. Ce qui n'est pas simple, c'est qu'un coup on travaille sur les instances, un coup de manière asymptotique, un coup…
Est-il normal que tu ne parles que d'OGA dans la section "Les défauts de la complexité pour la comparaison d’algorithmes" ? Vu que tu introduis le reste du tutoriel en disant que les mesures de complexité ne sont pas satisfaisantes, ce serait bien d'expliquer pourquoi chacune ne l'est pas.