J'ai besoin de trouver l'index d'un élément dans STD :: Set. Cet indice peut être visualisé comme la distance de l'itérateur du début.
Une façon peut être: cela prend clairement O (n) heure. Mais nous savons que la distance de la racine dans un arbre de recherche binaire tel que mise en œuvre par définie peut être trouvée en interne dans O (journal n) TIME. P> est leur façon de mettre en œuvre la même chose pour trouver l'index dans O (journal n) TEMPS EN C ++ SET? P> P>
5 Réponses :
Vous pouvez utiliser la fonction Cependant, comme indiquent que les commentaires indiquent que l'exécution de distance dépend du type d'itérateur utilisé. Dans le cas d'un ensemble, il s'agit d'un itérateur bidirectionnel et de la distance est O (n). P> p> std :: Set <> :: Trouver code>
pour rechercher un élément x code> et calculer le Distance sur le premier itérateur de l'ensemble.
C'est O (journal n + m) code>, cependant. Mais le meilleur que vous puissiez faire, Afaik.
Mais STD :: Distance est O (n) ici.
Je sais à propos de STD :: Distance, mais cela est mis en œuvre de la même manière que l'écrit dans la question et est définitivement d'o (n).
Vous ne pouvez pas utiliser de marématics avec des itérateurs bidirectionnels. Donc, seule une manière acceptable est de compter vous-même (combien de Mais, si vous avez une "collecte de données" et de "collection" et "de données", il vaut probablement la peine de remplacer
Vous pouvez utiliser le tri Par vecteur trié, je veux dire qu'après chaque insertion (ou après de nombreuses insertions), vous faites Si votre type à l'intérieur Juste quelques idées - avoir même std :: vecteur
O (journal n) code>. Et vous pouvez trouver la distance dans le temps constant
o (1) code>. P>
std :: Trier (v.begin (), v.end ()); Code> P>
std :: Set
int code> - vous pouvez garder les deux -
std :: set
std :: Vecteur
t code>? Ou garder
std :: set
comp_first_of_pair code> est juste d'avoir
définir code> Trier uniquement par
t code> et le second
int code> est destiné à garder la position dans SET? P>
o (1) code> distance ... p>
Mais trier après chaque insertion dans std :: vecteur me coûterait O (nlogn). Où est l'avantage?
1) Vous ne pouvez trier qu'après une série d'insertions consécutives. 2) Coût d'insertion dans std :: Set <> code> est
o (journal> - N insertions:
O (n log n) code>. 3) Peut-être que vous
insérer code> une fois - mais la distance de test plusieurs fois ....
Si calculer l'index est
STD :: map code>.
Bien sûr, cela signifie que vous devez garder ce cache mis à jour. LI>
std :: vecteur code>. Ce n'est pas aussi mauvais que cela pourrait regarder d'abord.
Si vous gardez le vecteur toujours trié, vous pouvez l'utiliser comme un
définir code>.
Les performances seront similaires à code> définir code>.
Le plus grand inconvénient est: le nœud peut être copié beaucoup.
(Ceci peut être compensé à l'aide des pointeurs,
Boost: partagé_ptr code> ou
std :: unique_ptr code> [C ++ 11 seulement])
de
Pour rechercher un élément que vous utilisez std :: inférieur code>. de
Au lieu d'insertion / push_back, vous faites: Insérer (BASTER_BOUND (B, E, X), X) CODE> LI>
ul>
Insérer est une fonction O (n) en vecteur
Et n'oubliez pas d'utiliser une version spécialisée de BASTER_BOND pour les conteneurs qui le met en œuvre. NEWER UTILISE STD :: Multi) Carte et (MULTI) SETS ET (MULTI)
Vous pouvez trouver l'index d'un élément dans un ensemble dans O (journal (n)) avec un ensemble commandé: https://www.geeksforgeeks.org/ordered-set-gnu-c-pbds/ . Ceci est implémenté comme un arbre noir noir. Je sais que ce sujet est très vieux, mais cela pourrait aider les lecteurs à l'avenir. P>
Plutôt que de créer un lien vers une ressource externe, veuillez extraire la partie correspondante de celle-ci et l'inclure dans votre réponse.
Pourquoi auriez-vous besoin de l'index?
Êtes-vous sûr qu'il est possible de trouver la distance dans
O (log n) code> heure dans un arbre de recherche binaire?
SET CODE> est typiquement un arbre noir rouge, qui n'a pas beaucoup d'informations sur chaque nœud sur le nombre d'éléments dans ses sous-arbres de gauche et de droite respectivement. N'oubliez pas que vous ne cherchez pas la distance directement de la racine, vous recherchez le nombre total de feuilles à gauche de la feuille que vous avez.
@Stevejessop: Ohh, donc leur n'est pas un moyen de calculer l'index dans O (logn) dans l'arbre R-B alors?