Il n'y a pas d'explication «one-size-fits-all» pour savoir où un terme O (log k) pourrait apparaître.
Vous voyez parfois cette exécution se produire dans les algorithmes de recherche et de tri où vous n'avez besoin de réorganiser qu'une petite partie de la séquence. Par exemple, la fonction std::partial_sort
de la bibliothèque standard C++, qui réorganise la séquence de façon à ce que les premiers k éléments soient triés et les autres dans un ordre quelconque O (n log k). Une façon de le mettre en œuvre est de maintenir un min-tas de taille au plus k et de faire n insertions/suppressions sur lui, qui est n opérations qui prennent chacune du temps O (log k). De même, il existe un algorithme O (n log k) -time pour trouver les k éléments les plus importants dans un flux de données, ce qui fonctionne en maintenant un maximum de k éléments au maximum. (Aucune de ces approches ne sont optimales, cependant - vous pouvez effectuer un tri partiel dans le temps O (n + k log k) en utilisant un algorithme de sélection linéaire et trouver de manière similaire les k premiers éléments d'un flux de données dans O (n).) M
Vous voyez aussi parfois cette exécution dans des algorithmes qui impliquent une stratégie de division et de conquête où la taille du problème en question dépend de certains paramètres de la taille d'entrée. Par exemple, le Kirkpatrick-Seidel algorithm pour calculer une coque convexe fait un travail linéaire par niveau dans une récurrence, et le nombre de couches est O (log k), où k est le nombre d'éléments dans la coque convexe résultante. Le travail total est alors O (n log k), ce qui en fait un algorithme sensible à la sortie.
Dans certains cas, un terme O (log k) peut apparaître parce que vous traitez une collection d'éléments un chiffre à la fois. Par exemple, radix sort a un temps d'exécution de O (n log k) lorsqu'il est utilisé pour trier n valeurs qui vont de 0 à k inclusivement, avec le terme log k résultant du fait qu'il y a des chiffres O (log k) dans le nombre k.Dans les algorithmes de graphes, où le nombre d'arêtes (m) est lié mais peut être indépendant du nombre de nœuds (n), vous voyez souvent des temps d'exécution comme O (m log n), comme c'est le cas si vous implement Dijkstra's algorithm with a binary heap.