9
votes

Un algorithme de tri efficace pour une liste presque triée contenant des données de temps?

Le nom dit tout vraiment. Je soupçonne que le tri d'insertion est préférable, car c'est le meilleur tri pour les données principalement triées en général. Cependant, étant donné que je sais plus sur les données dont il y a une chance, il y a d'autres sortes que ce soit. Les autres informations pertinentes sont donc:

1) Il s'agit de données temporelles, ce qui signifie que je présumable pourrait créer un hachage efficace pour la commande de données. 2) Les données n'existeront pas tous à la fois. Au lieu de cela, je vais lire dans des enregistrements pouvant contenir un vecteur unique ou une douzaine ou des centaines de vecteurs. Je veux produire tout le temps dans une fenêtre de 5 secondes. Il est donc possible qu'une sorte que le tri soit le tri que je insère les données serait une meilleure option. 3) La mémoire n'est pas un gros problème, mais la vitesse du processeur est que cela peut être un goulot d'étranglement du système.

Compte tenu de ces conditions, quelqu'un peut-il suggérer un algorithme qui peut être jugé jugé en plus de la sorte d'insertion? En outre, comment défini-t-on "principalement trié" pour décider quelle est une bonne option de tri? Qu'est-ce que je veux dire par c'est comment puis-je regarder mes données et décidé que ce n'est pas aussi trié que je le pensais comme, peut-être que l'insertion sorte que le tri n'est plus la meilleure option »? Tout lien vers un article qui a considéré la complexité de processus qui définit mieux la complexité par rapport aux données degrés est triée serait appréciée.

merci

EDIT: Merci à tous pour votre information. Je vais aller avec une assemblée facile ou une sorte de fusion (selon laquelle j'ai déjà été pré-écrit) pour l'instant. Cependant, je vais essayer certaines des autres méthodes une fois proches de la phase d'optimisation (puisqu'elles prennent plus d'efforts pour mettre en œuvre). J'apprécie l'aide


4 commentaires

Je suppose que vous cherchez un algorithme de tri ?


Comme si vous avez dit .... Tri d'insertion. trier-algorithms.com/narly-sorted-InitialOrder


Quelles sont la gamme et la granularité de vos données de temps?


La gamme et la granularité varient. Des sources multiples et la gamme, la gradathularité et même le niveau de «tri» peuvent varier en fonction de la source.


6 Réponses :


2
votes

Je voudrais jeter dans Fusionner le tri Si vous implémentez la version naturelle, vous obtenez un meilleur cas de O (n) avec un cas typique et pire de O (n log n) Si vous avez des problèmes. Insertion Vous obtenez un pire cas de O (n ^ 2) et un meilleur cas de O (n) .


0 commentaires

3
votes

Vous pouvez adopter une option (2) que vous avez suggérée - trier les données pendant que vous insérez des éléments.

Utilisez un Skip List , trié en fonction de l'heure, ascendant pour maintenir vos données. < / p>

  • Une fois qu'une nouvelle entrée arrive - Vérifiez s'il est plus grand que le dernier Élément (facile et rapide) si c'est - simplement l'annonce (facile à faire dans une liste de saut). Les La liste de saut devra ajouter 2 nœuds en moyenne pour ces cas et sera O (1) sur moyenne pour ces cas.
  • Si l'élément n'est pas plus grand, alors le dernier élément - ajoutez-le à la Sauter la liste sous forme d'insertion standard, qui sera O (logn) .

    Cette approche vous donnera O (n + klogn) algorithme, où k est le nombre d'éléments insérés hors de la commande.


3 commentaires

Vous pouvez également le faire avec une BST équilibrée tant que vous suivez l'élément maximum. Je pense que l'approche BST serait probablement meilleure du point de vue de la mémoire, surtout si vous avez utilisé quelque chose comme une arborescence ou une arbre de bouc émissaire avec exactement deux pointeurs par nœud.


@Templatetypedef: Bien que je crois que cela puisse être fait - je trouve la liste de sauts beaucoup plus intuitive puis une BST. Si la BST n'est pas auto-équilibrée -Il est susceptible de se dégrader dans un arbre avec une grande hauteur pour l'entrée décrite et la recherche d'éléments qui sont venus non ordonnés seront expansifs. D'autre part, la ré-équilibrage de l'arborescence après avoir ajouté un nouveau maximum est moins intuitive, puis ajoute un élément à une liste de sauts, à mon avis au moins.


@amit au lieu d'utiliser une structure de données pour trier les éléments hors de placement à côté des éléments triés, vous pouvez les trier séparément, puis les fusionner plus tard. Voir ma réponse pour plus de détails. Le résultat est un O (n + k lg k) algorithme.



0
votes

Il existe de nombreux algorithmes de tri adaptatifs qui sont spécifiquement conçus pour trier les données principalement triées. Ignorer le fait que vous stockez des dates, vous voudrez peut-être regarder Smoothsort ou tri cartésien Tri Comme algorithmes pouvant trier les données raisonnables triés dans le pire des cas O (n log n) temps et meilleur cas O (n) temps. SmoothSort a également l'avantage de ne nécessiter que O (1) espace, comme un tri d'insertion.

Utiliser le fait que tout est une date et peut donc être converti en un entier, vous voudrez peut-être consulter Binary Quicksort (Sort Radix MSD) à l'aide d'une sélection de pivotement de trois de trois. Cet algorithme a le meilleur cas O (N log n), mais a un facteur constant très faible qui le rend assez compétitif. Son pire cas est O (N Log u), où vous êtes le nombre de bits à chaque date (probablement 64), ce qui n'est pas trop mauvais.

J'espère que cela vous aide!


0 commentaires

0
votes

Si votre bibliothèque OS ou C fournit une fonction Mergesort, il est très probable qu'il gère déjà le cas où les données données sont partiellement commandées (dans n'importe quelle direction) fonctionnant dans O (n) Temps.

Sinon, vous pouvez simplement copier les fusorts disponibles à partir de votre système d'exploitation BSD préféré.


0 commentaires

1
votes

sans comprendre complètement le problème, Timsort peut correspondre à la facture que vous allez les données sont déjà triées.


0 commentaires

2
votes

Vous pouvez trier une liste de taille n avec k éléments hors de la place dans O (n + k lg k) heure.

Voir: http://www.quora.com/how-can-i-quically-sort-an-Array-Of-Elements-That-is-Already-sorte-except-for-a-small-number-of- Éléments-Say-up-up-to-1-4-de-to-total-Positions-sont connus / Réponse / Mark-Gordon-6? Partager = 1

L'idée de base est la suivante:

  • Itérate sur les éléments du tableau, construisant une sous-séquence croissante (si l'élément actuel est supérieur ou égal au dernier élément de la recherchequence, appendez-le à la fin de la recherche. Sinon, jetez à la fois l'élément actuel et le dernier élément de la recherchequence). Cela prend O (n) heure.
  • vous aurez jeté plus de 2k car k est hors de propos.
  • Trier les éléments 2K supprimés à l'aide d'un algorithme de tri (k lg k) de type fusion ou de tassort.
  • Vous avez maintenant deux listes triées. Fusionner les listes dans O (n) Time telle que vous le feriez dans la fusion de la fusion du tri.

    Complexité de temps globale = O (n + k lg k)

    Complexité globale de l'espace = O (n)

    (Ceci peut être modifié pour exécuter dans O (1) espace si vous pouvez fusionner dans o (1) espace, mais ce n'est pas trivial)


0 commentaires