7
votes

Quelqu'un connaît cette structure de données Python?

La classe Python a six exigences énumérées ci-dessous. Seuls les termes audacieux doivent être lus comme des exigences.


  1. proches de o (1) performance pour autant de quatre opérations suivantes.
  2. Maintenance ordre trié lors de l'insertion un objet dans le conteneur.
  3. capacité à peek sur la dernière valeur (la plus grande valeur) contenue dans l'objet.
  4. Permettant POP des deux côtés (Obtenir les valeurs les plus petites ou les plus grandes).
  5. Capacité de Obtenir la taille totale ou le nombre d'objets stockés.
  6. Être une solution prêt faite comme le code de la bibliothèque standard de Python.

    Ce qui suit est laissé ici pour des raisons historiques (aidez curieux et prouve que des recherches ont été menées).


    Après avoir examiné la bibliothèque standard de Python (spécifiquement la section sur les types de données), je n'ai toujours pas trouvé de classe qui répond aux exigences des exigences d'une table de fragmentation. collections.deque est proche de ce qui est requis, mais cela ne prend pas en charge la conservation des données contenues dans elle. Il fournit:

    1. ANNEXE EFFICIVE ET POPS de chaque côté d'une dent avec O (1) performance .
    2. pops sur les deux côtés pour les données contenues dans l'objet.
    3. obtenir la taille totale ou le nombre d'objets contenus dans.

      Mise en œuvre d'une solution inefficace utilisant des listes serait triviale, mais la recherche d'une classe qui fonctionne bien serait bien plus souhaitable. Dans une simulation de mémoire croissante sans limite supérieure, une telle classe pourrait conserver des index de cellules vides (supprimées) et maintenir les niveaux de fragmentation vers le bas. Le module bisect peut aider:

      1. aide à conserver un tableau dans la commande triée tout en insérant de nouveaux objets dans le tableau.
      2. Solution Prêt Fabriqué Pour garder les listes triés, car les objets sont ajoutés.
      3. permettrait d'exécuter tableau [-1] à peek à la dernière valeur dans le tableau.

        Le candidat final qui n'a pas réussi à satisfaire pleinement les exigences et est apparu le moins prometteur était le module HASPQ . Tout en soutenant ce qui ressemblait à des insertions efficaces et à assurer que matry [0] était la plus petite valeur, le tableau n'est pas toujours dans un état entièrement trié. Rien d'autre n'a été trouvé aussi utile.


        Est-ce que quelqu'un connaît-il d'une classe ou d'une structure de données dans Python que s'approche de près à ces six exigences?


11 commentaires

Quelles 6 exigences? "Ajout d'efficacité sur de chaque côté " et "Gardez un tableau dans la commande triée pendant l'insertion" sont contradictoires.


C'est pourquoi je cherche quelque chose qui s'approche aux exigences.


Je suppose que la performance O (1) pour que l'APPENCE n'est que si c'est le min / max?


Il n'y a pas d'exigence pour ajoute, seules les insertions triées. Je pense qu'un type d'arbre binaire trié est requis pour la solution.


"1. Appendez-vous efficace ... de chaque côté ... avec O (1) performance." n'est pas une exigence?


Non, seuls les termes audacieux sont des exigences. Je disais simplement ce que collections.deque est capable de faire. C'est pourquoi POP des deux côtés est mentionné directement par la suite.


Le texte audacieux o (1) performance n'est pas une exigence significative. O (1) pour quoi? Veuillez ajouter une liste d'exigences claires et succinctes que nous n'avons pas à plisser les yeux dans un texte non apparenté et devinez. Google ne sait pas quelle "table de fragmentation" est, et moi non plus.


Vous n'avez pas besoin de savoir quelle est une table de fragmentation. Cependant, j'utiliserais la structure de données décrite ci-dessus pour mon but d'une table de fragmentation de mémoire de mémoire . Ce que cela signifie est spécifique à mon objectif et a été prévu dans le but d'être suffisant pour le curieux. Les gens n'ont pas besoin de demander: "Qu'est-ce que tu essayes de faire?"


Je n'ai pas demandé ce que vous utilisez et je m'en fiche. Est-ce que cela est censé être une justification de refus de clarifier la liste des exigences, ou avez-vous simplement ignoré les 80% des premiers% de ce que j'ai dit?


S'il vous plaît, pardonnez-moi d'ignorer les 80% de ce que vous avez dit. C'était faux de moi. Je pensais que les lecteurs associent facilement O (1) la préformance comme une exigence pour autant d'opérations que possible (spécifiquement insertion, apparaissant, jumelage et longueur de longueur). Je suis devenu de plus en plus agacé contre les gens de sorte que cela demande pourquoi quelqu'un veut faire quelque chose plutôt simplement répondre à la question (si possible sans avoir à connaître la raison). J'essayais d'être courtois à curieux en indiquant ce que la structure doit être utilisée, mais ne voulait plus offrir d'explication des raisons.


Très souvent "qu'est-ce que tu essayes de faire" est une façon courte et polie de dire "Votre question me conduit à soupçonner que vous allez sur votre problème de mauvaise manière; veuillez décrire le problème d'origine plutôt que le coin que vous avez peint vous-même dans."


3 Réponses :


12
votes

Vos exigences semblent être:

  1. o (1) pop de chaque extrémité li>
  2. efficace len code> li>
  3. ordre trié li>
  4. PEEK AT DERNIÈRE VALEUR LI> ol>

    pour lequel vous pouvez utiliser un deque code> avec une méthode personnalisée insert code> qui tourne la dqueque, ajoute à une extrémité et se détache. P>

    >>> from collections import deque
    >>> import bisect
    >>> class FunkyDeque(deque):
    ...     def _insert(self, index, value):
    ...             self.rotate(-index)
    ...             self.appendleft(value)
    ...             self.rotate(index)
    ...
    ...     def insert(self, value):
    ...             self._insert(bisect.bisect_left(self, value), value)
    ...
    ...     def __init__(self, iterable):
    ...             super(FunkyDeque, self).__init__(sorted(iterable))
    ...
    >>> foo = FunkyDeque([3,2,1])
    >>> foo
    deque([1, 2, 3])
    >>> foo.insert(2.5)
    >>> foo
    deque([1, 2, 2.5, 3])
    


1 commentaires

Eh bien, il nécessite également O (1) (ou près de O (1)) pour l'insertion dans l'ordre. La dentque avec toute la rotation fait l'opération O (n), n étant la longueur de la dentelle.



9
votes

Beaucoup merci à Katrielaalex pour fournir l'inspiration qui a conduit à la classe Python suivante: xxx


3 commentaires

Si vous le pouviez - pourriez-vous jeter un coup d'œil aux questions Q3, Q4 de mon message [ Stackoverflow.com/questions/4295806/... et dites-moi si vous utilisez FastTable est une réponse à Q3, Q4?


Pour Peek (), pourquoi ne pas utiliser file d'attente [0] ou file d'attente [-1] comme suggéré dans les docs? L'accès indexé est O (1) aux deux extrémités (mais ralentit vers O (n) au milieu) - docs.python.org/2/library/collections.html#collections.deque .


@Milochen c'est une bonne question! Merci d'avoir posé la question. Vérifiez la version révisée pour voir si vous le souhaitez mieux.



2
votes

Blist.Sortedlist

  1. proche de O (1) performance pour autant de quatre opérations suivantes.
  2. Maintenance de la commande triée tout en insérant un objet dans le conteneur.
  3. capacité à jeter un coup d'œil sur la dernière valeur (la plus grande valeur) contenue dans l'objet.
  4. permettant aux POP des deux côtés (obtenir les valeurs les plus petites ou les plus grandes).
  5. Capacité d'obtenir la taille totale ou nombre d'objets stockés.
  6. Être une solution prête comme le code de la bibliothèque standard de Python.

    C'est un arbre B +.


0 commentaires