Estoy buscando una estructura de datos que mantenga una tabla entera de tamaño , y que permita las siguientes operaciones en el tiempo .n O ( log n )
- , que aumenta .
- , que disminuye .
- , que devuelve el número de índices tal que .t [ i ] ≠ 0
Tiene la promesa de que cada llamada a disminuir puede coincidir con una llamada anterior para aumentar con los mismos parámetros . La aplicación que tengo en mente es un algoritmo de línea de barrido para calcular en el tiempo el área de la unión de n rectángulos rectilíneos dados.O ( n log n )
Un árbol cuádruple tendría un tamaño , por lo que no es una solución. Los árboles Fenwick o Interval tienen el sabor correcto, pero no veo cómo extenderlos para apoyar las operaciones anteriores.
ds.data-structures
cg.comp-geom
Christoph Dürr
fuente
fuente
Respuestas:
Use un árbol de segmentos: una partición recursiva del rango en rangos más pequeños. Cada intervalo de sus operaciones de actualización puede dividirse en de los rangos en esta partición recursiva. Para cada rango almacenar:[ a , b ] O ( log n ) [ x , y ][1,n] [a,b] O(logn) [x,y]
Entonces, si se divide recursivamente en y tenemos para que podamos actualizar cada valor de en tiempo constante cuando los otros datos para Un rango cambia. Cada consulta de soporte puede responderse mirando .[ x , z ] [ z + 1 , w ] u ( x , y ) = { 0 si c ( x , y ) > 0 u ( x , z ) + u ( z + 1 , y ) de lo contrario u ( x , y ) u ( 1[x,y] [x,z] [z+1,w]
Para realizar una operación de aumento , particione en rangos , incremente para cada uno de estos rangos y use la fórmula anterior para recalcular para cada uno de estos rangos y cada uno de sus antepasados. La operación de disminución es la misma con una disminución en lugar de un incremento.(a,b) [a,b] O(logn) c(x,y) u(x,y)
fuente
Puede admitir y en y en tiempo .increase decrease O(n−−√logn) support O(1) La idea clave es dividir la tabla en grupos de tamaño . Luego de cada operación de modificación ( o ) opera en al mayoría de grupos, y solamente los que están cerca del final de su rango ( y , en su formulación) tome tiempo.Θ(n−−√) increase decrease O(n−−√) a b ω(logn)
fuente