Nous appelons généralement un algorithme «bon algorithme» si son temps d'exécution est polynomial dans le pire des cas. Mais dans certains cas (par exemple l'algorithme Simplex), même si le pire des cas de l'algorithme est exponentiel, cela pourrait très bien fonctionner dans la pratique.
Existe-t-il des exemples (déterministes) de cette situation autres que l'algorithme Simplex?
ds.algorithms
Arman
la source
la source
Réponses:
Les algorithmes de résolution SAT modernes sont capables de résoudre la plupart des instances assez rapidement, même si le pire temps d'exécution est, bien sûr, exponentiel. Dans ce cas, cependant, la vitesse pratique est davantage le résultat d'années d'ingénierie algorithmique que celle d'un seul algorithme élégant. Bien que j'aie compris que l'apprentissage des clauses axées sur les conflits a provoqué un saut majeur dans les performances des solveurs SAT, les améliorations ultérieures ont souvent été obtenues par une utilisation intelligente de diverses heuristiques dans les algorithmes.
la source
L' algorithme moyens pour le clustering est prouvablement exponentiel même dans le plan, mais il fonctionne très bien en pratique.k
la source
L'inférence de type Hindley-Milner est complète en EXPTIME, mais sur les programmes que les gens écrivent, elle est assez proche du linéaire.
la source
let z = (let y = e in e') in e''
par opposition à quelet y = e in let z = e' in e''
.Le programme nauty (No AUTomorphisms, Yes?) De Brendan McKay résout le problème d'étiquetage canonique des graphiques (résolvant simultanément les problèmes d'isomorphisme graphique et d'automorphisme graphique) et a des performances exponentielles dans le pire des cas (Miyazaki, 1996). Cependant, cela fonctionne très rapidement pour la plupart des graphiques, en particulier ceux avec quelques automorphismes.
Plus précisément, l'algorithme commence par partitionner les sommets par degré, puis par degré entre chaque partie. Lorsque ce processus se stabilise, un choix doit être fait pour distinguer un sommet dans une partie non triviale, ce qui conduit au comportement exponentiel. Dans la plupart des graphiques, la profondeur de cette procédure de branchement est faible.
la source
Plusieurs algorithmes pour les jeux stochastiques simples fonctionnent bien dans la pratique, même s'ils ont des temps d'exécution exponentiels dans le pire des cas. Bien sûr, ce problème est en quelque sorte lié à la programmation linéaire, bien qu'il ne soit pas connu qu'il soit en temps polynomial.
la source
Il existe un algorithme pour trouver des équilibres Nash mixtes qui est similaire à l'algorithme simplex pour les LP. (J'oublie le nom.) Il a une complexité exponentielle dans le pire des cas, mais j'ai un vague souvenir qu'il se comporte souvent bien dans la pratique.
la source
L'emballage des bacs (de nombreuses variantes) est un problème dont la complexité est connue pour être NP-difficile:
http://en.wikipedia.org/wiki/Bin_packing_problem
Cependant, de nombreuses heuristiques appliquées à des versions "pratiques" fonctionnent très bien. Pour l'emballage bin à 1 dimension, certaines de ces heuristiques, comme le premier ajustement; premier ajustement décroissant; meilleur ajustement; le meilleur ajustement décroissant est très intéressant comme sujet à montrer aux élèves. Les élèves peuvent souvent découvrir par eux-mêmes certaines des heuristiques de base.
la source
L'algorithme de persistance (originaire d'Edelsbrunner-Letscher-Zomorodian, avec de nombreuses variations depuis) est le pire des cas cubique, mais semble d'expérimentation pour s'exécuter généralement en temps linéaire.
la source