Je recherche une structure de données qui maintiendrait une table entière de taille , et permettant les opérations suivantes dans le temps .
- , ce qui augmente .
- , qui diminue t [ a ] , t [ a + 1 ] , … , t [ b ] .
- , qui renvoie le nombre d'indices i tels que t [ i ] ≠ 0 .
Vous avez la promesse que chaque appel à diminuer peut être comparé à un appel précédent pour augmenter avec les mêmes paramètres . L'application que j'ai en tête est un algorithme sweepline pour calculer dans le temps O ( n log n ) l'aire de l'union de n rectangles rectilignes donnés.
Un quadruple arbre aurait la taille , donc ce n'est pas une solution. Les arbres Fenwick ou Interval ont la bonne saveur, mais je ne vois pas comment les étendre pour prendre en charge les opérations ci-dessus.
ds.data-structures
cg.comp-geom
Christoph Dürr
la source
la source
Réponses:
Utilisez une arborescence de segments - une partition récursive de la plage en plages plus petites. Chaque intervalle [ a , b ] de vos opérations de mise à jour peut être partitionné en O ( log n ) des plages de cette partition récursive. Pour chaque plage [ x , y ] magasin:[1,n] [a,b] O(logn) [x,y]
Alors si est récursivement divisé en [ x , z ] et [ z + 1 , w ] nous avons u ( x , y ) = { 0 si c ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) sinon[x,y] [x,z] [z+1,w]
Pour effectuer une opération d'augmentation , partitionnez [ a , b ] en plages O ( log n ) , incrémentez c ( x , y ) pour chacune de ces plages et utilisez la formule ci-dessus pour recalculer u ( x , y ) pour chacune de ces plages et pour chacun de leurs ancêtres. L'opération de diminution est la même avec un décrément au lieu d'un incrément.(a,b) [a,b] O(logn) c(x,y) u(x,y)
la source
la source