Obtenir Min/Max en O(1) le temps d'une File d'attente?
Comment puis-je récupérer le max et le min élément d'une file d'attente à tout moment en 0(1) le temps de la complexité?
Plus tôt, j'ai été à l'aide de Collections.max et min pour trouver les éléments, mais que serait 0(n).
À moins que la file d'attente est triée, vous ne pouvez pas...
Utilisation Treeset au lieu de la file d'attente.
Vous pouvez créer des champs spéciaux qui va stocker max/min quelle que soit vous mettez à jour votre file d'attente et le lire en cas de besoin.
oui, mais la mise à jour nécessiterait non-constante de temps.
Recherche pour min pile O(1). Ensuite, la recherche de mettre en œuvre la file d'attente à l'aide de 2 piles. Combiner et vous aurez min de File d'attente O(1), O(1) moyenne de la pop.
Utilisation Treeset au lieu de la file d'attente.
Vous pouvez créer des champs spéciaux qui va stocker max/min quelle que soit vous mettez à jour votre file d'attente et le lire en cas de besoin.
oui, mais la mise à jour nécessiterait non-constante de temps.
Recherche pour min pile O(1). Ensuite, la recherche de mettre en œuvre la file d'attente à l'aide de 2 piles. Combiner et vous aurez min de File d'attente O(1), O(1) moyenne de la pop.
OriginalL'auteur h4ck3d | 2012-08-21
Vous devez vous connecter pour publier un commentaire.
Vous ne disposez que de 2 façons d'obtenir de l'O(1) pour un min/max de fonctionnement:
Ok, donc le lien dans ma réponse est rompu pour <les utilisateurs de 10k 😉
Recherche pour min pile O(1). Ensuite, la recherche de mettre en œuvre la file d'attente à l'aide de 2 piles. Combiner et vous aurez min de File d'attente O(1), O(1) moyenne de la pop.
OriginalL'auteur assylias
Il existe une telle structure qui agit comme une file d'attente, mais vous permet d'extraire des min/max de la valeur de la constante de temps, en fait pas strictement constante, il est amorti de la constante de temps (nommé min/max de la file d'attente comme vous avez pu le deviner). Il y a deux façons de la mettre en œuvre - à l'aide de deux piles ou à l'aide d'une file d'attente et un deque.
Deque la mise en œuvre ressemble plus ou moins comme ceci (langue agnostique):
nous avons donc une deque maximum d'éléments, l'un sur le front de l'est souhaité max, et une file d'attente standard.
Opération Push
Opération de suppression
Obtenir un max
(beaucoup d'arguments doit être ajoutée pour préciser pourquoi cela fonctionne, mais la deuxième version présentée ci-dessous peut être la réponse à cette nécessité)
La Pile de la mise en œuvre est assez similaire, je pense que c'est peut être un peu plus longue à mettre en œuvre, mais peut-être plus facile à saisir. La première chose à noter est qu'il est facile à stocker le maximum de l'élément de la pile - exercice facile (pour les paresseux - Pile à trouver min/trouver-max plus efficace que O(n)?). La deuxième partie, peut-être un peu délicat si vu la première fois, c'est assez facile à mettre en place une file d'attente à l'aide de deux piles, il peut être trouvé ici - Comment mettre en place une file d'attente à l'aide de deux piles? . Et c'est, fondamentalement, il s' - si nous pouvons obtenir le maximum de l'élément à la fois des piles, nous pouvons obtenir le maximum d'élément de l'ensemble de la file d'attente (prise maximale est associatif ou quelque chose comme ça si vous voulez plus d'argument formel, mais je parie que vous n'avez pas, il est vraiment évident).
Min versions se fait de manière analogue.
Tout ce qui peut également être effectuée à l'aide d'un ensemble (ou quelque chose du genre) en O(nlogn) de temps, mais c'est inutile, car la constante en O(n) est vraiment petit et il devrait être beaucoup plus rapide, mais facile à mettre en œuvre.
NON-parties INTÉRESSANTES de la première version:
Espère que j'ai aidé un peu. Et de l'espoir qui n'a pas dit quelque chose de mal. Peut donner une mise en œuvre simple en C++/C si nécessaire. Serais reconnaissant pour toute remarque sur la forme comme c'est mon premier post de ce type n'importe où 🙂 (et l'anglais n'est pas ma langue maternelle). Aussi la confirmation de l'exactitude serait génial.
EDIT: comme cette réponse m'a certains moments, j'ai senti obligé de le nettoyer un peu, de l'étendre un peu.
OriginalL'auteur Szymon
Mettre en œuvre une file d'attente dans laquelle push_rear(), pop_front() et get_min() sont tous de la constante de temps des opérations
OriginalL'auteur Erben Mo
Je voudrais stocker deux champs minIndex et maxIndex qui va stocker les positions d'index dans votre structure de données pour la valeur minimum et maximum respectivement.
Lorsque de nouveaux éléments sont ajoutés à la file d'attente, vérifier deux choses:
Cela vous donnera un O(1) asymptote pour le courant min et la valeur max.
Ah, ouais, il est préférable de créer deux pile en outre, l'un pour les valeurs minimales et l'autre pour les valeurs maximales.
En fait, cela ne vous aidera pas non plus. Lorsque vous ajoutez à une extrémité et retirez à l'autre, la file d'attente comme un ensemble de transitions entre les différents états qui ne sont pas à la hauteur de tout état précédent. Donc l'histoire approche est inutile.
Comment sur l'utilisation de deux files d'attente pour min et max?
OriginalL'auteur algolicious
Ce n'est pas vraiment une file d'attente, mais vous pouvez mettre en œuvre Min-Max Tas.
http://en.wikipedia.org/wiki/Min-max_heap
En gros, c'est un segment qui a max propriété tas à même les niveaux, et min propriété tas au impair niveaux.
Il a deux O(1) MIN() et O(1) MAX (). Cependant, il est plutôt difficile à réitérer, mais il fonctionne et répond à vos besoins.
OriginalL'auteur milleniumbug
Je vous poste le code complet ici pour trouver des MIN et MAX dans la file d'attente en un temps constant.
Sentez-vous svp libre pour me contacter si vous avez un doute.
File d'attente
Deque
FindMinMaxQueue
MyQueue
MinAndMaxFinderQueue
Test
OriginalL'auteur java baby
Je soupçonne que vous essayez de mettre en œuvre ce qu'un PriorityQueue. C'est un classement de la file d'attente qui O(log N) pour obtenir la valeur la plus basse. Je ne sais pas pourquoi vous voulez à la plus grande valeur qu'une file d'attente n'a qu'une fin.
Intéressant, si vous avez l'utilisation de la mémoire du tas? (les tableaux et les objets sont sur le tas)
Ce que je voulais dire c'est que pour mettre en œuvre un PQ , j'aurais besoin d'utiliser min-tas / max-heap , heapify opérations ! C'est-à-dire , segment( comme une structure de données).
Le groupe builtin PriorityQueue n'ont pas de ces opérations docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html
OriginalL'auteur Peter Lawrey