Comment trouver le k-ième plus petit entier dans un tableau non trié sans trier le tableau?
Je suis donc donné un (non triées) Un tableau de N entiers distincts, je suis en train de mettre en œuvre un divide-and-conquer algorithme pour trouver la k-ième plus petit élément (K ≤ N) de la matrice (c'est à dire qu'il serait l'ensemble de la plus petite si K=1). L'algorithme retourne la valeur de la k-ième plus petit élément dans le tableau. J'en ai besoin pour s'exécuter en O(N) fois dans la moyenne des cas. Quelqu'un pourrait-il me donner quelques conseils?
Vous devez vous connecter pour publier un commentaire.
Sephy, je vais marcher à travers de très près. Vous devez toujours être prudent lorsque vous aider les gens avec des algorithmes, car, et je ne peux pas insister assez sur ce, algorithme de résolution de problèmes problèmes sont à des programmeurs de ce poids de levage est pour les athlètes professionnels. Savoir mettre vous-même dans le mode de penser comme un ordinateur est ce que vous aurez payé pour le faire dans quelques années. Donc, si les solutions sont donnés seulement à vous, vous allez être le gars qui rebondit de poste en poste tous les 6 mois au lieu de le gars qui devient le principal développeur, ou va sur son propre avec un succès de l'entreprise.
Maintenant, que le délire est de la route...
Traditionnellement, on pense à des algorithmes de parcourir le tableau une fois, et une boucle par elle différemment selon le premier résultat, et répétez jusqu'à ce que nous avons rencontré certaines conditions, à O(n^2). Les choses qui répondent à ce critère sont la sélection de tri, le tri par insertion, et de tri à bulles.
Mais il n'a pas à être. Si nous pouvons diviser le tableau en segments et de prouver la taille de ces segments, nous pouvons garder sur un faible.
Et, avec plus de diviser et conquérir des algorithmes, on peut commencer par le milieu.
Que savons-nous sur Une petite et Une grande? Sont-ils la même taille? Peut-être, mais probablement pas.
Est
size(A-small) > k
? ou est-il< k
?Si
size(A-small) == k - 1
, ça ne ferait pas de M la k-ième plus petit élément?Est là quelque chose que nous pouvons faire pour créer une nouvelle valeur de k, et faire un peu de recurrsion ici?
Je ne suis pas en train de terminer cette pour vous, car il devrait y avoir beaucoup à mâcher. Telles sont les questions que vous devez vous poser. @templatetypedef est de 100% sur la bonne voie, c'est juste de l'expansion sur elle.
Si vous avez des questions, leur demander, mais il devrait y avoir assez de place ici pour vous permettre de le résoudre sans voler vous de votre exercice mental.
Comme astuce, pensez à la façon dont le quicksort partition étape fonctionne. Il divise l'entrée de sorte que le pivot est dans sa position finale, les plus petits éléments sont à gauche, et les plus gros éléments sont à droite. Compte tenu de cette information, et de savoir ce que l'indice que vous tentiez de trouver, pourriez-vous penser à une façon récursive de trouver la kième élément?
De compter les occurrences de chaque entier du tableau dans un autre tableau.
Pour de tels problèmes classiques, wikipédia fonctionne très bien...
Voir Algorithme de sélection sur wikipédia
essayez de rechercher l'algorithme de sélection, ou de la sélection de l'algorithme de tri
Temps Complexcity est presque O(N).