Existe-il des cas où vous préférez une plus grande-O complexité temporelle de l'algorithme sur le bas de l'un?

Sont qu'il ya des cas où vous préférez O(log n) temps la complexité de O(1) temps de la complexité? Ou O(n) à O(log n)?

Avez-vous des exemples?

  • Je préfère un O(log n) algorithme à une O(1) algorithme de comprendre si le premier, mais pas le dernier...
  • Il y a des tonnes de impossible structures de données O(1) opérations de l'informatique théorique. Un exemple serait de select() sur bitvectors, qui peut être pris en charge en o(n) de l'espace supplémentaire, et O(1) par opération, à l'aide de 5 couches d'indirection. Simple binaire de recherche, combiné avec O(1) rang() s'avère être plus rapide dans la pratique, selon l'auteur de la Succincte Structure de Données de la Bibliothèque
  • Bas asymptotique de la complexité n'est pas gage temps d'exécution plus rapide. La recherche de la matrice de multiplication par un exemple concret.
  • Aussi...tout algorithme peut être converti à O(1), étant donné un nombre suffisamment important de la lecture de la table 😉
  • Pour un exemple concret, SmoothSort a le meilleur des cas O(n) la performance et le pire des cas O(n log n), alors que les QuickSort a le meilleur des cas O(n log n) la performance et le pire des cas O(n ^ 2) (!). Qui voyez-vous en pratique?
  • C'est en supposant que la table de recherche est O(1), ce qui n'est pas donné à tous pour la taille de vos tables, vous voulez parler! 🙂
  • il sera en O(1), parce qu'elle sera indépendante de la saisie. Il va donc dépendre de la taille de l'espace d'entrée (c'est à dire le domaine de la fonction)
  • Je vais prendre un algorithme je peux juste appeler à partir de la langue de la bibliothèque sur quoi que ce soit de l'auto-mise en œuvre ou d'un tiers à tout moment, à moins qu'il soit un rendement réel problème dans mon application. Plus vite écrit, plus facile documenté, facile maintenu, mieux testé.
  • La différence entre O(1) et O(log n) est seulement de l'intérêt à la théorie de l'ordinateur scientifiques. Les personnes travaillant dans le Monde Réel ont de meilleures choses à s'inquiéter, comme la différence entre O(n) et O(n^2).
  • Si l'espace d'entrée est délimitée puis chaque algorithme est de $O(1)$. La complexité n'a d'intérêt que lorsque l'entrée de l'espace n'est pas borné, dans ce cas, votre table de recherche est certainement pas $O(1)$. Par exemple, toute la table de recherche sur un mot-taille architecture est $\Omega(\log(n))$, ce qui est clair, parce que toute la ramification programme avec un maximum de sortance égale à la taille de mot doit être logarithmique en le nombre de sorties.
  • Umm. Dire que nous avons tout type de graphe d'algorithme qui dépend de tous les nœuds de décider de la solution. La seule façon de regarder le résultat dans votre table de recherche est de visiter chaque nœud d'entrée au moins une fois (sinon, comment savez-vous quelle solution choisir?). Donc vous avez une complexité au moins O(V). Maintenant, évidemment, si votre taille est limitée, S(V) est une constante qui est en O(1), mais la même chose est vrai pour absolument chaque algorithme et vous n'avez pas besoin de tout type de table de recherche pour que,
  • Vraiment le droit. Après réflexion, ce que j'ai dit n'est vrai que dans certains algorithmes, où les entrées sont des valeurs scalaires.
  • ah mais la taille de votre entiers augmente de façon logarithmique de la taille de saisie 😉
  • Big-O analyse généralement ignore les détails de mise en œuvre (mise en cache, la mémoire, etc.) 😉
  • N'a rien à voir avec les détails de mise en œuvre. Si votre entrée est un nombre unique, si ce nombre peut être arbitrairement grand, il faut O(log n) bits pour être représenté, qui nécessite O(log n) le temps de lire. Cela est ignoré par de nombreuses analyses pour une bonne raison, mais si vous ne faites pas attention et d'ignorer cela, vous pouvez facilement prouver que vous avez un polynôme solution pour un NP-difficile de l'algorithme. Voir, par exemple, Pseudo-polynomial en temps.
  • Ou si un autre exemple est plus facile: L'entrée de notre susmentionnés graphique problème peut facilement être représenté comme un seul nombre (après tout c'est ce que la mémoire de l'ordinateur est fondamentalement) - donc, par le même argument, comme avant, il ne peut pas être en O(1).
  • La question est un peu trop large (comme peut être vu à partir de la très vague réponses qui vont comme: la vitesse, l'espace, l'algorithmique longueur, ...). Vous avez peut-être certains plus spécifiques à des domaines d'application dans l'esprit?
  • Vous devez disposer d'un tableau dont les clés de la regarder le graphique lui-même. Il faudrait énumérer tous les possibles graphiques, puisque le graphe est une partie de l'entrée. Le seul problème est que si les graphiques qui peuvent être utilisés est un ensemble infini. De façon réaliste, dans la programmation d'ordinateur, nous pouvons faire l'affirmation que le domaine est techniquement fini depuis que l'ordinateur est finie. Donc Hoten est toujours, au moins à partir d'un certain point de vue.
  • Dès que vous supposez que le domaine d'entrée est fini, il n'a pas d'importance si vous utilisez une table de recherche ou pas - dans ce cas, tous les algorithmes sont en O(1) par définition! Quicksort, knappsack, voyageur de commerce - tous les O(1) et que, sans aucun tables de recherche impliqués. Et si vous ne supposez pas que le domaine est fini, la table de recherche de ne pas obtenir de la plupart des problèmes jusqu'à O(1) soit (vous pouvez les obtenir à O(n) avec tout de même).
  • Votre déclaration au sujet de la lecture de la table n'a pas de sens parce que nous utilisons big-O notation pour afficher le temps d'exécution asymptotique croissance, exécutez pas le temps lui-même. c'est à dire votre expression doit être valable pour n arbitrairement grand.
  • Il y a une jolie structure de données appelée la Bloom filter qui permet d'ajouter et de manière probabiliste de vérifier la présence d'un élément en O(1) fois, mais a la possibilité de mal à répondre "présent" lorsque l'élément n'est pas en fait. Les arbres se donner la réponse avec certitude en O(log n).
  • Je serais probablement préfèrent un O(log n)-time / O(1)-space algorithme à une O(1)-time / O(10^(n^999))-space un 🙂
  • Cette fameuse question est fortement connexe et illustre un cas où la direction de la prévision des effets causé un log n temps de marche (tri d'un tableau) pour être plus rapide que n (boucler sur le tableau), même pour un assez grand n.
  • Parmi les tri des réseaux, l'AKS réseau est théoriciens de la " meilleure construction de profondeur O(log n) par rapport à O((log n)**2) pour Doseur de tri et bitonic tri—mais la constante rend totalement impossible. Knuth: "Doseur de la méthode est beaucoup mieux, à moins que n dépasse la capacité de mémoire totale de tous les ordinateurs sur terre!
  • Votre question est mathématiquement demander si un log(x) peut être inférieure à une constante ou si x peut être inférieure à log(x) ou une constante. Jetez un oeil à cette intrigue et à vous de me le dire fooplot.com/plot/m3dwiddyny
  • Parfois, le ralentissement de l'algorithme peut avoir d'autres propriétés qui sont importants. Par exemple, le tri rapide est généralement plus rapide que mergesort, mais mergesort est intrinsèquement stable tandis que quicksort ne l'est pas; ainsi, si l'ordre des entrées de l'égalité des touches de questions mergesort peut être préférable.

InformationsquelleAutor V.Leymarie | 2015-12-09