2012-08-01 5 views
1

Quelle structure de données prend en charge efficacement les opérations d'ensemble suivantes dans le temps et dans l'espace?Structure de données pour les opérations d'ensemble

  1. union
  2. différence
  3. isMemberOf
  4. ajouter
  5. supprimer

Je peux penser à 3 façons différentes de faire ces opérations, supposons que nous avons deux ensembles, leurs tailles sont les deux N:

Bit Tableau:

1. O(N) 2.O(N) 3.O(1) 4.O(1) 5.O(1) 

Hashtable:

1. O(N) 2.O(N) 3.O(1) 4.O(1) 5.O(1) 

Ordonné Arbre:

1. O(NlogN) 2.O(NlogN) 3.O(logN) 4.O(logN) 5.O(logN) 

Bit tableau et Hashtable sont rapides mais ils utilisent trop de mémoire, arbre ordonné est lent mais consomme moins de mémoire.

S'il vous plaît noter: l'ensemble peut contenir d'autres types sauf entier, tels que le nombre flottant ou une chaîne

Quelles sont les autres structures de données sont à la fois rapide et générale, et efficace de l'espace?

+0

Quelle est l'application dans laquelle vous essayez d'utiliser cette structure de données? –

+3

Pourquoi ne peut pas une table de hachage (jeu de hachage) tenir arbitraire (mais comparable) des objets comme un arbre ordonné? –

+0

Pour l'analyse du journal, toutes les opérations ne sont pas nécessaires, mais je suis curieux. – outlaw

Répondre

2

Une option consiste à augmenter votre arbre ordonné avec un filtre bloom pour accélérer les tests de type ismemberof.

Je pense que le comportement global serait quelque chose comme:

1. O(N log(N)) 2. O(?) 3.O(1) 4.O(log(N)) 5.O(log(N)) 

Cependant, les détails exacts dépendront de la taille du filtre, la taille de vos jeux et la taille de votre domaine.

Une autre option peut être Judy Arrays. J'ai entendu de bonnes choses à leur sujet pour ce genre d'utilisation, mais je n'ai aucune expérience personnelle.

Encore une autre option est un forrest approach (plutôt qu'un arbre binaire pur).

+0

floraison peut donner des faux positifs? – outlaw

+0

Oui, il peut certainement - mais ses négatifs sont toujours valables. Donc, vous recherchez l'arbre s'il renvoie un résultat positif, mais vous évitez une traversée d'arbre si elle vous donne un résultat négatif. –

+0

je vais regarder dans le tableau judy, il semble intéressant – outlaw

1

Je vous suggère Binary Heap (le plus facile), Binomial Heap (accélération de l'union) et Fibonacci Heap (les plus difficiles à mettre en œuvre, mais ayant les plus connus fois amorti pour une utilisation standard).

Opération                               binaire Heap                               Binomial Heap                               tas de fibonacci (amorti)
1. union                                                   O (n)                                                       O (logn)                                                                   O (1)
2.différence                             O (nlogn)                                                 O (nlogn)                                                               O (nlogn)
3. find (isMemberOf)             O (n)                                                           O (n)                                                                         O (n)
4.ajouter                                                     O (LGN)                                                     O (LGN)                                                                       O (1)
5.supprimer                                             O (LGN)                                                     O (LGN)                                                                       O (LGN)

Cependant, ces structures sont principalement utilisés lorsque insert, find/min extrait (max), union et supprimer opérations sont nécessaires. trouver et diff opérations ont encore le temps de mauvais fonctionnement.

Questions connexes