Très souvent, si le temps d'exécution d'un algorithme est une expression compliquée, l'algorithme lui-même est également compliqué et peu pratique. Chacune des racines de cube et facteurs log log n dans le temps d'exécution asymptotique tend à ajouter de la complexité à l'algorithme et également des facteurs constants cachés au temps d'exécution.
Avons-nous des exemples frappants dans lesquels cette règle empirique échoue?
Bien sûr, il est facile de trouver des exemples d'algorithmes qui sont très difficiles à implémenter même s'ils ont un temps d'exécution très simple dans le pire des cas. Mais qu'en est-il de l'inverse?
Avons-nous des exemples d' algorithmes déterministes très simples et pratiques qui sont faciles à mettre en œuvre mais qui ont une expression très compliquée comme étant le temps d'exécution asymptotique le plus défavorable?
Veuillez noter les mots clés "déterministe" et "pire des cas"; l'analyse d' algorithmes aléatoires simples conduit assez facilement à des expressions compliquées.
Bien sûr, ce qui est "compliqué" est une question de goût. Quoi qu'il en soit, je préférerais voir une expression beaucoup trop moche pour mettre dans le titre de votre article. Et je préférerais une fonction compliquée d' un paramètre naturel (taille d'entrée, nombre de nœuds, etc.).
PS. Je pensais que je ne ferais pas de cette question une «grande liste», et non CW. J'aimerais trouver un seul excellent exemple (s'il existe). Par conséquent, veuillez publier une autre réponse uniquement si vous pensez qu'elle est "meilleure" que n'importe laquelle des réponses jusqu'à présent.
la source
Réponses:
Le meilleur exemple auquel je peux penser est un algorithme (décrit ci-dessous) pour calculer le niveau dans un arrangement de n lignes dans le plan, c'est-à-dire la ligne polygonale formée par les points qui ont exactementk n lignes verticalement au-dessus. Ce n'est pas l'algorithme le plus efficace connu pour le problème. Il existe des algorithmes plus efficaces avec des complexités plus simples, mais je crois que celui-ci est plus pratique que la plupart (sinon tous) d'entre eux. L'analyse n'est probablement pas serrée, car elle utilise lacomplexité de niveau k , qui est un problème ouvert célèbre (je pense que tous les autres termes de l'analyse sont serrés). Même encore, je doute que l'amélioration des limites pour k -level rendrait le temps d'exécution beaucoup plus simple. Je suppose que k =k k k pour écrire la complexité en fonction de n seul.k = n / 2 n
L'algorithme est basé sur le paradigme de balayage de ligne et utilise deux tournois cinétiques -ary comme files d'attente de priorité cinétique. Les insertions et les suppressions sont effectuées lorsqu'une ligne passe au-dessus ou en dessous du niveau k , déplaçant une ligne d'un tournoi cinétique à l'autre. Par conséquent, il y a O ( n 4 / 3 ) des insertions et des deletions ( à l' aide de la destination de Dey k complexité -level). Chaque événement est traité en O ( log n ) du temps et il y a O ( n quatre / trois α ( n( journaln ) k O ( n4 / 3) k O ( logn ) provient de la hauteur d'un arbre ( log n ) -ary ). La durée totale de fonctionnement est événements (le α ( n ) provient de la complexité de l'enveloppe supérieure des dispositions des segments de ligne, tandis que le log n / log log nO ( n4 / 3α ( n ) logn / logJournaln ) α ( n ) Journaln / logJournaln ( journaln )
Veuillez consulter le manuscrit de Timothy Chan http://www.cs.uwaterloo.ca/~tmchan/lev2d_7_7_99.ps.gz pour plus de détails et de références. Le facteur peut être supprimé à l'aide d'un binaire (au lieu de ( log n1 / journalJournaln tournoi cinétique ) -ary), mais il accélère en fait la file d'attente de priorité cinétique dans les tests que j'ai effectués. La complexité devrait devenir un peu plus laide et pire (alors que l'algorithme sera toujours pratique) si un tas cinétique est utilisé à la place d'un tournoi cinétique (un journal à l' intérieur d'une racine carrée devrait apparaître).( journaln ) Journal
la source
Les opérations de structure de données union-find semblent répondre à vos critères:
http://en.wikipedia.org/wiki/Disjoint-set_data_structure
la source
Algorithme simplex. Facile à mettre en œuvre et fonctionne à merveille dans la pratique, mais est un gâchis à analyser théoriquement.
la source
Je ne sais pas si vous considérez cela comme "pratique" mais c'est un fameux problème ouvert. Paul Erdos a déclaré à propos de la conjecture de Collatz: «Les mathématiques ne sont pas encore prêtes pour de tels problèmes»
la source
Cet exemple, bien que ne répondant pas à la lettre de votre demande, peut être intéressant car il porte une certaine affinité spirituelle. Plus précisément, la question du tri des piles de crêpes et crêpes brûlées par retournements.
http://en.wikipedia.org/wiki/Pancake_sorting
Un domaine d'application est la biologie computationnelle (génétique) où les questions sur les réarrangements du génome peuvent être formulées en termes de distance entre les permutations en utilisant des inversions de morceaux de permutations soumises à diverses règles.
la source