Plus rapide de la structure de données pour l'insertion/tri
J'ai besoin d'une structure de données qui peut insérer des éléments et de les trier lui-même le plus rapidement possible. Je vais être l'insertion d'un beaucoup plus que le tri. La suppression n'est pas une préoccupation, et nethier est l'espace. Mon spécifiques de mise en œuvre permettra en outre de stocker des nœuds dans un tableau, de recherche sera O(1), c'est à dire que vous n'avez pas à vous inquiéter à ce sujet.
si vous êtes à la recherche par le biais d'un tableau, pourquoi avez-vous besoin de la structure de données à trier? Est-il besoin d'être dans l'ordre après chaque insertion?
Oui, il doit être dans l'ordre après l'insertion. Je ne vais pas être d'indexation de l'élément directement, mais plutôt le nœud, ce qui devrait avoir accès à ses voisins des nœuds.
Vous avez vous-même contredite. La question dit "je vais être l'insertion d'un beaucoup plus que le tri", mais votre commentaire dit "il doit être dans l'ordre après [chaque] insérer". Si la première est vraie, alors ma réponse peut être approprié. Si ce dernier est vrai, alors vous êtes probablement mieux avec un arbre, comme suggéré par squadette (bien que je ne suis pas sûr qu'il doit être équilibré, comme il le suggère, depuis les recherches ne sont pas vraiment un problème).
Oups, ce n'était pas de penser correctement. Je voulais dire ne pas doivent être dans l'ordre après chaque insertion. Désolé.
Oui, il doit être dans l'ordre après l'insertion. Je ne vais pas être d'indexation de l'élément directement, mais plutôt le nœud, ce qui devrait avoir accès à ses voisins des nœuds.
Vous avez vous-même contredite. La question dit "je vais être l'insertion d'un beaucoup plus que le tri", mais votre commentaire dit "il doit être dans l'ordre après [chaque] insérer". Si la première est vraie, alors ma réponse peut être approprié. Si ce dernier est vrai, alors vous êtes probablement mieux avec un arbre, comme suggéré par squadette (bien que je ne suis pas sûr qu'il doit être équilibré, comme il le suggère, depuis les recherches ne sont pas vraiment un problème).
Oups, ce n'était pas de penser correctement. Je voulais dire ne pas doivent être dans l'ordre après chaque insertion. Désolé.
OriginalL'auteur someguy | 2010-09-03
Vous devez vous connecter pour publier un commentaire.
Si vous êtes l'insertion d'une beaucoup plus de tri, alors il peut être préférable d'utiliser une liste non triée/vecteur, et quicksort quand vous en avez besoin triés. Cela permet de maintenir insère très rapide. La une1 inconvénient est que le tri est relativement longue de l'opération, puisqu'il n'est pas amortis sur le nombre d'insertions. Si vous dépendez d'relativement constante de temps, cela peut être mauvais.
1 Venez pour penser à elle, il y a un deuxième inconvénient. Si vous sous-estimez votre tri de la fréquence, ce qui pourrait rapidement être globalement plus lent qu'un arbre ou une liste triée. Si vous triez après chaque insertion, par exemple, l'insertion+quicksort cycle serait une mauvaise idée.
Eh bien, je suppose que tout dépend de la équilibrage de la surcharge se produit réellement, et comment beaucoup de la traversée, il empêche.
Vous pouvez être intelligent sur le tri. Si vous créer un wrapper pour la liste/vecteur, vous pouvez garder une trace de ce que la partie a déjà été triées (son le devant de la liste, donc vous avez juste besoin d'un indice unique). Puis, quand vous voulez resort, vous venez de sorte que la partie non triée et fusionner. Ensuite, la complexité est de loin inférieur à la normale O(n log n) pour le tri.
OriginalL'auteur P Daddy
D'utiliser l'une des auto-équilibré binaires de recherche arbres, comme le rouge-l'arbre noir.
Si vous souhaitez qu'elles soient triées après chaque insertion, avec un nombre arbitraire d'éléments, de sorte que vous ne pouvez pas simplement avoir des seaux pour chaque élément, puis un arbre est le chemin à parcourir. Que des inserts & trie de la même opération; vous n'allez pas obtenir beaucoup plus rapide que ce que j'en ai peur.
OriginalL'auteur squadette
Si vous pouvez faire beaucoup de plaquettes avant chaque sorte alors évidemment, vous devez simplement ajouter les articles et de les trier plus tôt que vous en avez besoin. Ma préférée est la fusion de tri. Qui est O(N*Log(N)), est bien comporté et a un minimum de stockage, de manipulation (nouvelle, malloc, arbre d'équilibrage, etc.)
TOUTEFOIS, si les valeurs de la collection sont des nombres entiers et raisonnablement dense, vous pouvez utiliser un O(N), où il vous suffit d'utiliser chaque valeur comme un index dans un big-assez de tableau, et de définir la valeur booléenne TRUE à l'index. Ensuite, il suffit de scanner l'ensemble de la baie et de recueillir les indices qui sont VRAIES.
Vous dites que vous êtes le stockage des éléments dans un tableau où la recherche est O(1). Sauf si vous êtes en utilisant une table de hachage, qui suggère que vos articles peuvent être dense entiers, donc je ne sais pas si vous même ont un problème.
Peu importe, la mémoire, l'allocation/suppression est cher, et vous devriez l'éviter en pré-attribution ou de mise en commun si vous le pouvez.
OriginalL'auteur Mike Dunlavey
Utiliser l'un de l'Équilibre des arbres binaires, comme AVL arbres. Elle devrait donner à O(lg N) temps de complexité pour des opérations que vous cherchez.
OriginalL'auteur sadakurapati
J'ai eu une bonne expérience pour ce genre de tâche à l'aide d'un Ignorer La Liste
Au moins dans mon cas, il était environ 5 fois plus rapide par rapport à l'ajout à une liste d'abord, puis en exécutant une sorte à la fin.
OriginalL'auteur Quasimondo
Si vous n'avez pas besoin d'un accès aléatoire dans le tableau, vous pouvez utiliser un Tas.
Pire et la durée moyenne de la complexité:
Peut être reconfiguré pour donner plus petite valeur à la place de plus grand. Par plusieurs reprises de retirer la plus grande/plus petite valeur que vous obtenez une liste triée en O(N log N).
OriginalL'auteur Isaac Turner