Algorithme " La complexité "

Fermé
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017 - 10 déc. 2016 à 04:39
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 14 déc. 2016 à 23:42
Bonjour, Voilà en voulant résoudre quelque Algorithme j'me rends compte que par moment , je n'arrive pas a définir la complexité de mon Algorithme ( O(n)) , Par exemple à quelle moment peut t'-on déduire qu'un Algorithme quelconque requiert d'un for imbriqué , ou d'une seule boucle , y'a t-il des indicateur dans un Algorithme qui me permet de définir à l'avance la complexité de mon Algorithme ?

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 déc. 2016 à 07:39
Bonjour,

La théorie de la complexité est une branche assez pointue de l'informatique. En général on ramène le problème cherché à un problème similaire dont on connaît déjà la complexité afin de déduire qu'ils ont la même complexité.

Dans tout les cas il faut décorreler le calcul de complexité de l'algorithme.
Ce n'est pas parce qu'un problème est en O(n) qu'il se code obligatoirement avec une boucle et en O(n²) avec deux boucles imbriquées.
Le calcul de la complexité n'aide généralement pas à déduire le code.
D'ailleurs certains problèmes existent dont on ne connaît pas de code capables d'atteindre la complexité théorique qu'ils pourraient avoir.

En revanche si tu as le code on peut en déduire la complexité, soit théoriquement par analyse, soit empiriquement en traçant un graphe.
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
10 déc. 2016 à 09:10
Ah d'accord je vois merci , Oui c'est comme par exemple le Tri par comptage qui requiert un for imbriqué mais dont sa complexité est exprimé en O(n) , Justement c'est l'une des difficultés que j'éprouve lorsque je suis confronté à un Algorithme , Par exemple y'a certaines méthodes que j'essaie de résoudre mais je n'arrive pas a me posé les bonnes questions et pouvoir déterminé si j'aurais besoins d'une boucle ou plus ce qui m’empêche de codé.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 déc. 2016 à 09:56
C'est vraiment du cas par cas. Il n'y a que l'habitude qui te permettra de faire les bons choix, mais dans les programmes "de la vraie vie" c'est à 90% des traitements en O(n) malgré des boucles imbriquées liée à la structure objet.

Exemple :

List<List<List<String>>> list1 = ...;
for (List<List<String>> list2 : list1)
     for (List<String> list3 : list2)
          for (String str : list1)
               f(str);

La complexité s'exprimant sur f() est en O(n) car on appelle une seule fois chacun des String malgré les 3 boucles for qu'il est nécessaire de parcourir pour décomposer la structure objet initiale afin de traiter tous les String voulus.
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
10 déc. 2016 à 14:46
Ahh d'accord j'vois un peut plus clair a présent Merci donc supposons que maintenant nous avons :
List<List<List<String>>> list1 = ...;
for (List<List<String>> list2 : list1)
     for (List<String> list2 : list3)
          for (String str : list1)
               f(str); 

Dans ce cas puis-je en conclure que la complexité de cet Algorithme est exprimé en O(n^2) car j'Utilise plus d'une fois list2 ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 déc. 2016 à 17:01
Ce code ne compilerai pas donc je ne sais pas exactement ce que tu voudrais en faire.

Un exemple de O(n²) serait l'utilisation d'un f() à deux paramètres ayant chacun un élément de la liste.

List<String> list = ...;
for (String str1 : list)
    for (String str2 : list)
        f(str1, str2)

Ici on peut voir ça comme un tableau, avec les éléments de la liste en colonne et les mêmes éléments de la même liste en ligne, donc les résultats f() sont inscrits sur chaque case de ce tableau, et sont donc beaucoup plus nombreux que lors de l'exemple précédent dont les appels à f() ne se faisaient que sur une dimension, en ligne.
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
11 déc. 2016 à 08:20
Ahh d'accord et Donc par Exemple supposons que nous venons a manipuler des Tableaux multidimensionnels , pourraient t-ont considéré que la complexité est de l'Ordre O(n²) ?
0