Mon algorithme initial:
- Comparez l'élément 0 avec tous les autres éléments, en gardant une trace du nombre d'éléments qui lui sont inférieurs.
- Répétez l'opération pour chaque élément jusqu'à ce qu'un élément supérieur à exactement (k-1) soit trouvé.
Je suppose que cela prendrait au pire des cas. Peut-on obtenir un temps d'exécution plus rapide sans trier la liste?
search-algorithms
lists
POURQUOI
la source
la source
Réponses:
Utiliser l'algorithme de sélection pour le temps linéaire https://en.m.wikipedia.org/wiki/Selection_algorithm
la source
Malheureusement, je ne peux pas simplement commenter mais je dois le poster comme réponse.
Quoi qu'il en soit, vous pouvez essayer d'utiliser un segment min sur votre tableau non trié, vous devriez pouvoir obtenir une complexité temporelle de O (n + k * logn).
la source
L'algorithme Quickselect peut le faire dans une complexité moyenne O (n), c'est l'un des algorithmes de sélection les plus utilisés selon Wikipedia .
Il est dérivé de QuickSort et souffre en tant que tel d'une complexité O (n²) dans le pire des cas si vous utilisez un mauvais pivot (un problème qui peut être évité dans la pratique).
L'algorithme en bref: après le pivotement comme dans QuickSort, ne descendez que dans le côté inférieur ou supérieur du tableau - selon lequel d'entre eux a l'élément que vous recherchez.
la source
Créer un tas max de taillek . L'invariant est que le tas contient toujours lek les plus petits éléments observés jusqu'à présent.
À la fin, le tas contiendra lek les plus petits éléments de la liste.
La recherche de l'élément maximal a un coût constant. Le coût d'insertion et de suppression estO ( k ) . La complexité temporelle de cette méthode estO ( n . Logk )
la source