Comment puis-je efficace de garder une trace du plus petit élément dans une collection?

StackOverflow https://stackoverflow.com/questions/33973

  •  09-06-2019
  •  | 
  •  

Question

Dans la veine de les questions de programmation:supposons qu'il y a une collection d'objets qui peuvent être comparés les uns aux autres et triés.Quel est le moyen le plus efficace pour garder une trace du plus petit élément dans la collection que les objets sont ajoutés et le courant plus petit parfois supprimé?

Était-ce utile?

La solution

À l'aide d'un min-tas est le meilleur moyen.

http://en.wikipedia.org/wiki/Heap_(data_structure)

Il est fait sur mesure pour cette application.

Autres conseils

Si vous avez besoin d'aléatoire d'insertion et de suppression, le meilleur moyen est sans doute un tableau trié.Les insertions et les suppressions doivent être O(log(n)).

@Harpreet
Qui n'est pas optimal.Lorsqu'un objet est supprimé, erickson devez analyser ensemble de la collection pour trouver le plus petit.

Vous voulez lire sur Un arbre de recherche binaires'.MS a une bonne site pour commencer sur le chemin.Mais vous voudrez peut-être obtenir un livre comme Introduction aux algorithmes (Cormen, Leiserson, Rivest, Stein) si vous souhaitez plonger en profondeur.

À l'occasion d'supprime un Tas De Fibonacci est encore plus rapide que le min-tas.L'Insertion est O(1), et de trouver le min est également en O(1).L'enlèvement est O(log(n))

Si vous avez besoin d'aléatoire d'insertion et de suppression, la meilleure façon est probablement une triés tableau.Les insertions et les suppressions doivent être O(log(n)).

Oui, mais vous aurez besoin de re-trier sur chaque insert et (peut-être) de chaque suppression, qui, comme vous l'avez dit, est O(log(n)).

Avec la solution proposée par Harpreet:

  • vous en avez un O(n) passer au début pour trouver le plus petit élément
  • les inserts sont en O(1) par la suite (seulement 1 comparaison nécessaires au déjà-connu plus petit élément)
  • supprime O(n), car vous aurez besoin de re-trouver le plus petit élément (gardez à l'esprit Big O la notation est le pire des cas).Vous pouvez également optimiser par la vérification pour voir si l'élément à supprimer est la (connus) à la plus petite, et si non, il suffit de ne pas faire de la re-vérifier, pour trouver le plus petit élément.

Donc, cela dépend.L'un de ces algorithmes sera mieux pour une insertion lourd, en cas d'utilisation avec quelques suppressions, mais l'autre est dans l'ensemble plus cohérent.Je pense que je serais défaut de Harpreet du mécanisme, à moins que je savais que le plus petit nombre serait retiré souvent, parce que qui expose un point faible de l'algorithme.

Harpreet:

les insertions dans cette serait linéaire, puisque vous avez à déplacer des éléments pour l'insertion.

N'est pas qui dépendent de la mise en œuvre de la collection?Si elle agit comme une liste liée, inserts serait O(1), tandis que s'il était mis en œuvre comme un tableau, il sera linéaire, comme vous l'avez indiqué.

Dépend des opérations vous avez besoin de votre conteneur à l'appui.Un min-tas est le meilleur si vous pouvez avoir besoin de supprimer le min élément à un moment donné, bien que plusieurs opérations sont non triviaux (amorti log(n) fois dans certains cas).

Toutefois, si vous avez seulement besoin de push/pop à partir de l'avant/arrière, vous pouvez simplement utiliser un mindeque qui réalise amorti de la constante de temps pour toutes les opérations (y compris findmin).Vous pouvez le faire un scholar.google.com recherche pour en savoir plus sur cette structure.Un ami et j'ai récemment collaboré pour atteindre un beaucoup plus facile à comprendre et à mettre en œuvre la version d'un mindeque, ainsi.Si c'est ce que vous cherchez je pouvais poster les détails pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top