2014-06-30 6 views
0

Je suis en train de développer une routine heuristique et j'ai besoin de maintenir une séquence/tableau/liste triée. J'ai entendu dire que le timsort est rapide pour maintenir l'ordre des séquences avec des sous-séquences déjà triées. D'autre part, ce dont j'ai besoin est assez simple. Après le tri initial de la séquence, je dois répéter l'une des opérations suivantes à chaque étape:timsort ou manuellement en maintenant une séquence triée, ce qui est plus efficace?

  1. Supprimer l'élément min. Visitez le plus petit K élément.

  2. insérer un élément et maintenir l'ordre.

timsort semble avoir une meilleure complexité de O (n). Naively, je peux mettre en œuvre l'opération 3 en appelant timsort pour obtenir O (n). Mais ces opérations doivent être répétées plusieurs fois. Je me demandais si maintenir manuellement une séquence triée (tableau ou liste) ou faire un partial_sort à chaque étape serait plus rapide, et si oui, quelles sont les complexités.

Pour la divulgation, j'utilise C++, et des exemples en C++/C++ 11 seraient nécessaires si nécessaire.

Merci,

+0

pourriez-vous effectuer des tâches ensemble? c'est-à-dire regrouper plusieurs éléments et les trier, mémoriser plusieurs éléments à supprimer et les supprimer tous en même temps? Ou est-ce ce que vous demandez? – Daniel

+0

non, je ne peux pas, car les étapes qui suivent dépendent de quel élément est le plus petit, ou est supprimé. L'insertion/suppression doit donc être faite par élément. – tinlyx

+0

Lorsque vous dites "maintenir manuellement", voulez-vous dire mettre les données en mémoire cache après les avoir triées et les utiliser la prochaine fois au lieu de les utiliser à chaque fois? Parce que "manuellement" pour moi signifie parcourir les données à la main et en cliquant sur "supprimer": P – Daniel

Répondre

1

On dirait que la meilleure approche serait d'utiliser effectivement un arbre de recherche binaire auto-équilibrage. Cela devrait gérer les insertions/suppressions dans O (log N) et itérer sur les k-plus petits éléments dans O (k) si je ne me trompe pas. Sauf si vous avez une raison, vous devez utiliser une liste.

Questions connexes