¿Cuál es la diferencia entre Segment Tree y Fenwick Tree en términos de operaciones?

Al igual que con cualquier estructura de datos que realice operaciones en subsegmentos, necesita asociatividad.

Fenwick Tree (o BIT – Binary Indexed Tree) es menos poderoso que Segment Tree: solo puede calcular sumas de prefijo , mientras que Segment Tree puede calcular sumas en cualquier subsegmento.

Siempre que solo necesite sumas de prefijos, puede realizar cualquier operación asociativa. En el momento en que desea utilizar BIT para operaciones en subsegmentos, debe aplicar algunos trucos sobre BIT.

El truco más popular es “restar” dos sumas de prefijos. Para hacer eso, la asociatividad no es suficiente: también necesita un elemento inverso y, en consecuencia, un elemento de identidad. Entonces. Su operación debe formar un grupo , no un semigrupo.

Algunos ejemplos de solicitudes que se pueden calcular utilizando el árbol de segmentos, pero no BIT:

  1. Intuitivamente: cualquier operación que pierde mucha información sobre la estructura interna de un segmento. Por ejemplo, máximo.
  2. O el que escribí en mi otra respuesta: conteo de elementos máximos.
  3. O desde allí, el subsegmento más largo de un subsegmento que solo contiene ceros.
  4. Multiplicación. Es imposible dividir por cero. O bien, si la multiplicación se realiza en un módulo, a veces el resultado de la división no se define de forma exclusiva (por ejemplo, 2 * 8 = 8 * 8 = 0 mod 16). Estrictamente hablando, es posible usar algunos trucos (por ejemplo, contar ceros o divisores no primos por separado), pero es mucho más difícil y no vale la pena.
  5. Multiplicación matricial. Nuevamente, la matriz inversa no es única (y a veces inexistente), pero no conozco ningún truco que permita convertir la multiplicación de la matriz en un grupo.

More Interesting

Cómo ordenar matrices en C

¿Qué técnicas se utilizan para calcular las probabilidades de caída de elementos en los juegos?

Imagine una cerradura de bicicleta combinada con 4 anillos que contienen 10 letras. ¿Cómo se puede calcular qué letras en cada anillo producirán las palabras más válidas?

¿Se necesitarán estructuras de datos y algoritmos para los ingenieros de diseño analógico o EDA?

¿El uso de algoritmos en una clave de contraseña típica de 256 bits que siempre está cambiando pero que aún se muestra al usuario (como en un teléfono, por ejemplo) para crear código requeriría supercomputadoras más rápidas disponibles para superarlo?

¿Cómo se determina la longitud de una matriz en C?

Quiero usar una cola prioritaria en un problema. Creo que implementar una cola prioritaria usando una matriz es más fácil que usar un montón. ¿Qué piensas y por qué?

¿Cuál es el número total de comparaciones en un tipo de burbuja?

Dada una lista de cadenas, ¿cómo puedo determinar si existe un orden de caracteres para el cual las cadenas están ordenadas en orden lexicográfico?

Cómo tomar una matriz 1d y convertir la matriz en una matriz 2d en una función c ++ para que la matriz ahora sea 2d en main ()

¿Las personas aprenden algoritmos antes de aprender JavaScript?

¿Qué algoritmo se usa para la transmisión de video?

Cómo usar el hash rodante y la búsqueda binaria para encontrar la subcadena común más larga

¿Por qué los algoritmos no hacen las preguntas sobre Quora?

¿Cómo saben los codificadores cómo codificar e implementar un algoritmo instintivamente?