¿Por qué un árbol de segmentos necesita una matriz de tamaño 4n? ¿Por qué no 2n-1?

De la programación competitiva 3

Esta rutina de creación crea hasta [matemáticas] O (1 + 2 + 4 + 8 + \ puntos + 2 ^ {\ log_2 (n)}) = O (2n) [/ matemáticas] segmentos más pequeños y, por lo tanto, se ejecuta en [matemáticas] O (n) [/ matemáticas]. Sin embargo, como utilizamos una indexación de matriz compacta basada en 1 simple, necesitamos que st (la matriz) tenga al menos un tamaño [matemático] 2 * 2 ^ {\ lfloor (\ log_2 (n) \ rfloor + 1} [/ math ]. En nuestra implementación simplemente usamos un límite superior suelto de complejidad espacial [matemática] O (4n) = O (n) [/ matemática].

Aquí se explica que se utiliza una implementación basada en 1, esto requiere más de [math] 2n-1 [/ math] space, por lo que en lugar de calcular [math] size = 2 * [/ math] [math] (int) pow (2, floor (log2 (n)) + 1) [/ math] es más rápido usar bit-shift [math] size = (N << 2) [/ math]. Además, dado que 4 es una constante, realmente no te importa.

Un árbol de segmentos funciona perfectamente bien con elementos 2N-1, hace varios años era común ver la versión 4N, mientras que hoy en día la versión 2N es bastante común.