A titre d'exemple, imaginez-vous eu les numéros suivants dans une liste dans cet ordre donné:structure de données qui prend en charge <O (n) requêtes somme des éléments 0 à n
list = [4, 10, 3, 5, 1]
si la liste [0] == 4, et list [4] == 1.
Imaginez maintenant que vous avez besoin d'une requête de somme qui vous dira la somme de toutes les valeurs précédentes jusqu'à cette position donnée.
list.sum(0) == 4
list.sum(1) == 14
list.sum(2) == 17
list.sum(3) == 22
list.sum(4) == 23
En outre, je voudrais les opérations suivantes, tout en conservant les requêtes de somme intacte:
list.swap(0, 1) // swap the two positions
list == [10, 4, 3, 5, 1]
list.slideBefore(0, 3) // slides 1st position value to before the 2nd position
list == [4, 3, 10, 5, 1]
list.slideAfter(2, 3) // slide 1st position value to after 2nd position
list == [4, 3, 5, 10, 1]
list.replace(3, 9) // replace value at 1st param with literal value 2nd param
list == [4, 3, 5, 9, 1]
list.append(17) // adds value to end
list == [4, 3, 5, 9, 1, 17]
Ceci peut être traité par trivialement un tableau. Mais la requête somme serait toujours O (n). J'espérais trouver une structure de données qui garderait la requête somme à O (1) ou O (lg n), tout en gardant les opérations ci-dessus à O (1) ou O (lg n).
Je crois que je pourrais être en mesure de manipuler la structure de données fast array pour accomplir ce que je veux, mais je ne l'ai pas complètement développé.
Une autre structure de données que j'ai examinée était l'arbre Fenwick, mais je ne savais pas que cela fonctionnerait.
Des suggestions, des idées, des astuces ou des astuces?
Remplacer est O (n) sous cette structure. Sinon, c'est très bien. –
Je ne vois pas comment slideBefore ou slideAfter pourrait être O (1). Par exemple, slideAfter (2,5) vous demanderait de recalculer les sommes pour les articles 3, 4 et 5. Accordé, «recalculer» consiste à soustraire la valeur que vous déménagiez. Si c'était slideAfter (2, 1002), vous recalculeriez 1000 valeurs. De plus, toute opération de "slide" est par nature une opération O (N) car vous devez déplacer les données dans le tableau. –
@Jim oui, la diapositive ne sera pas O (1), mais O (count_of_slided_elems). Mais si ce compte est en quelque sorte constant et ne dépend pas de 'n', vous pouvez dire que c'est O (1). – ruslik