Quel est le moyen le plus rapide pour trouver la plus petite valeur Kth dans une liste non triée sans tri?


8

Mon algorithme initial:

  1. 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.
  2. 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 O(n2)au pire des cas. Peut-on obtenir un temps d'exécution plus rapide sans trier la liste?



Pouvez-vous créer une deuxième liste et la trier? Ie Pouvez-vous créer une liste des k plus petites valeurs?
jmoreno

Réponses:


10

Utiliser l'algorithme de sélection pour le temps linéaire https://en.m.wikipedia.org/wiki/Selection_algorithm


2
En particulier, la médiane des médianes de Blum et al., 1973, résout le problème de sélection dans le pire cas linéaire. Probablement l'algorithme le plus élégant que j'ai jamais vu.
quicksort

6
Bien que cela réponde à la question, il est encouragé de faire sa propre description, pas seulement un lien.
Evil

4

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).


3
Malheureusement, je ne peux pas simplement commenter mais je dois le poster comme réponse. - ce qui était une bonne chose, car les réponses comme votre message n'appartiennent pas aux commentaires. Les commentaires visent à améliorer les questions, pas les réponses courtes ou similaires.
Wrzlprmft

1
Mh, j'ai l'impression que la mienne n'est pas une réponse à part entière pour être honnête, je n'ai pas donné de détails sur pourquoi ou comment l'utilisation d'un tas min pourrait réduire la complexité du temps, c'est pourquoi j'avais l'impression qu'il appartenait plus dans un commentaire que dans une réponse
Luca Giorgi

Ça dépend de ksi min-tas ou max-tas doit être utilisé.
Evil

3

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.


2

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.

  1. Insérez le premier k éléments de la liste dans le tas
  2. Pour chaque élément restant i dans la liste:
    • laisser M être l'élément maximum dans le tas
    • Si i<M, puis supprimez M et insérer i dans le tas

À la fin, le tas contiendra le k 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)


1
Max-tas ou Min-tas, cela dépend de k> n / 2.
Evil

@Evil Vous voulez vérifier si i est plus petit que l'un des éléments du tas. Vous voulez donc savoir s'il est plus petit que le plus grand d'entre eux. La recherche de l'élément maximal est O (1) dans max-heap, mais pas dans min-heap.
Behrouz Babaki

1
Vrai. Imaginez que k = 1 ou k = n, utiliseriez-vous le même tas dans les deux cas? Peut-être qu'il est possible d'utiliser le min-tas d'une manière ou d'une autre quand il est plus rapide? (Je sais que oui, vous avez +1 de ma part, juste un coup de pouce, ne vous inquiétez pas)
Evil

1
@Evil Tu as raison. J'ai rejeté votre commentaire à la hâte. Lorsque k> n / 2, on peut utiliser une méthode similaire pour stocker les (nk) éléments les plus grands dans un min-tas. Les éléments supprimés du tas sont ce que nous voulons.
Behrouz Babaki
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.