7
votes

Trouver une structure de données appropriée C ++

Je cherchais une simple structure de données implémentée qui obtient mes besoins remplis dans le moins de temps possible ( dans le pire cas possible ): -

(1) à la pop nième élément (je dois garder l'ordre relativement des éléments intacts)
(2) pour accéder à Nième élément .

Je ne pouvais pas utiliser Array car il ne peut pas faire sauter et je ne veux pas avoir d'espace après avoir supprimé l'élément. J'ai essayé de retirer l'écart, en échangeant le nième élément avec la prochaine fois avec la dernière fois, mais cela prouve le temps inefficace, bien que l'O (1) est imbattable.

J'ai essayé d'utiliser le vecteur et utilisé "Effacer" pour popup et '.at ()' pour l'accès, mais même ce n'est pas bon marché pour l'efficacité du temps, bien que sa matrice.


7 commentaires

Ne pas empiler s'adapte à cela?


@Bhanukaushik Comment allez-vous faire l'un d'entre eux à l'aide d'une pile?


ma faute . Je pense que j'ai mal compris. Excuses !


@Bhanukaushik, la pile est évidemment plus pire dans les deux conditions et aussi pire que le tableau et le vecteur avec une complexité O (n), O (n), tandis que la matrice fournit O (n) & O (1) et les vecteurs fournissent avec O (TN). & O (1): pile et file d'attente ici sont tout simplement beaucoup pires!


Qu'en est-il de std :: deque ? Bien que je ne le connaisse pas vraiment.


@Alvinwong, naah qui prendrait la même complexité que le vecteur prendrait - o (n) & (t-n).


@Alvinwong: STD :: Deque est rapide aux deux extrémités. Mais la question concerne un nième élément arbitraire dans une source de données d'éléments M, M> n. Je pense.


4 Réponses :


2
votes

Un tableau vous donnera O (1) recherche mais o (n) Supprimer de l'élément. Une liste vous donnera O (n) Bogue de recherche O (1) Supprimer de l'élément.

Un arbre de recherche binaire vous donnera o (journal n) Recherche avec O (1) Supprimer de l'élément. Mais il ne préserve pas l'ordre relatif.

Un arbre de recherche binaire utilisé conjointement avec la liste vous donnera le meilleur des deux mondes. Insérez un nœud dans la liste (pour conserver la commande) et l'arborescence (recherche rapide). Supprimer sera O (1) . xxx

Notez que si les nœuds sont insérés dans l'arbores à l'aide de la valeur de tri comme valeur de tri, vous allez se retrouver avec une autre liste liée prétendant être un arbre. Le L'arborescence peut être équilibré cependant dans O (n) temps une fois construit que vous ne seriez à engager qu'une seule fois.

update

y penser plus que cela pourrait ne pas être la meilleure approche pour vous. Je suis habitué à faire des recherches sur les données elles-mêmes, pas sa position relative dans un ensemble. Ceci est une approche centrée sur les données. Utilisation de l'index car la valeur de tri se cassera dès que vous supprimez un nœud car les indices "plus élevés" devront changer.


2 commentaires

Ok, je vais essayer ça :), mais une question, je n'aurai pas besoin de régler encore et encore après un nième pop?


Ouais, j'ai mis à jour mon post. Je lisais juste sur le vecteur à plusieurs niveaux mentionné par @izomorphius qui pourrait être meilleur.



3
votes

Ce que vous pouvez essayer est Skip List - Il prend en charge l'opération que vous demandez dans O ( journal (n)). Une autre option serait vecteur à plusieurs niveaux qui est légèrement plus facile mettre en œuvre et prend o (sqrt (n)). Les deux structures sont assez cool mais hélas pas très populaires.


3 commentaires

Ouais, je vois que les niveaux peuvent aussi être une bonne option, je vais l'essayer :)


@izomorphuis, pourrait donner un lien qui montre la mise en œuvre de "vecteur à niveau", c'est vraiment intéressant


Je l'ai mis en œuvre il y a quelque temps et je crois avoir utilisé l'article SMAE que je vous ai envoyé. Si vous savez comment faire une file d'attente cyclique dans un vecteur à plusieurs niveaux est assez simple. Je pourrais être capable de trouver mon code source mais je ne suis pas sûr que c'est "pour le public";)



0
votes

AVERTISSEMENT: Ne prenez pas cette réponse au sérieux.

En théorie, vous pouvez faire la fois en O (1). En supposant que ce sont les seules opérations que vous souhaitez optimiser. La solution suivante aura besoin de beaucoup d'espace (et il va fuir l'espace), et il faudra longtemps pour créer la structure de données:

Utilisez un tableau. Dans chaque entrée du tableau, pointez sur un autre tableau qui est identique, mais avec cette entrée enlevée.


0 commentaires

3
votes

Eh bien, vecteur à plusieurs niveaux mis en œuvre sur le tableau serait-il de penser au mieux à votre but . Bien que le concept de vecteur à plusieurs niveaux puisse être connu et peu délicat à comprendre au début, mais une fois que vous l'obtenez, cela ouvre beaucoup de questions et vous obtenez une arme pratique pour aborder très efficacement la partie de la structure de données de la question. Il est donc recommandé de maîtriser la mise en œuvre des vecteurs à plusieurs niveaux .


0 commentaires