Aplicaciones, ventajas y desventajas del árbol de segmentos

Primero, comprendamos por qué lo necesitamos antes de aterrizar en la introducción para entender por qué se introdujo este concepto. Supongamos que nos dan una array y necesitamos encontrar la subarreglo 

Propósito de los árboles de segmentos:

Un árbol de segmentos es una estructura de datos que se ocupa de un rango de consultas sobre una array. Tiene un enfoque de divide y vencerás. Se utiliza para resolver el rango mínimo y máximo y Consultas de suma y Consultas de actualización de rango en complejidad de tiempo O (log n).

Construcción del Árbol de Segmentos:

array[]: 5, 3, 2, 4, 1, 8, 6 10

usaremos divide y vencerás

 

Ahora veremos cómo segmentar el árbol. La construcción está lista.

El número de Nodes será = n + n/2 + n/4 + …… + 2+1

Progresión geométrica: la diferencia común será 2

Sea ‘x’ el número de términos, a = primer término y r = razón común.

(ar)^x-1 = n

a=1,r=2

(2)^x-1=n

log2(2)^x-1=log2n

x=1+log2n=número de niveles

(2) – número de Nodes = 1+2+4+….+n/2+n/4+n

1[(2)^1+inicio de sesión – 1]/2-1 => (2n-1)

 

Tomemos un ejemplo de devolución y actualización de la suma del subarreglo a[i…..j] de tamaño n.

Ejemplo:

 

Consulta: salida de la suma de i=1 a i=5

Enfoque 1: iterar de i = 1 a i = 5 y calcular la suma, actualizar el elemento en el i-ésimo índice, actualizaremos a[i] = elemento actualizado. ahora, la complejidad temporal de la consulta es O(n) y la actualización es O(1).

Enfoque 2: enfoque de suma de prefijos

Primero, construiremos la array de suma de prefijos.

 

Consulta: Salida de la suma de i a j

sum[i….j] = {pref[j] – pref[i-1]} (si i!=0)

preferencia[j] (si i=0)

Complejidad de tiempo : O(1)

Actualizando valor: Ponga a[i] = valor actualizado.

Para actualizar la array de prefijos, debemos cambiar todos los prefijos [i].

Formación:

5 3 2 4 1 8 6 10

yo=4,

Array de suma de prefijos:

5 8 10  14 15 23 29 39

Pongamos un ejemplo para entender esto.

Ejemplo: actualice el cuarto elemento de índice a 13.

Array original: arr[] 

5 3 2 4 13 8 6 10

Suma de prefijo: arr[] todos los elementos se modifican porque el cuarto índice se actualiza, por lo que afectará a todos los elementos después del tercer índice.

5 8 10 14 27 35 41 51

Tabla de comparación de complejidad de tiempo:

  Consulta Actualizar
Enfoque-1 En) O(1)
Enfoque-2 O(1) En)
Árbol de segmentos O(registro(n)) O(registro(n))

Requisito de complejidad de tiempo de registro (n): muchas veces, la cantidad de consultas y la cantidad de actualizaciones son del orden de 105-106, obtendremos TLE si usamos el enfoque 1 o el enfoque 2.
 

Construcción de un árbol de segmentos:

Es muy simple construir un árbol de segmentos, usamos el enfoque divide y vencerás para construir el árbol de segmentos.

pseudocódigo para la implementación del árbol de segmentos:

const int N = 1e5+2;
int a[N];
árbol int[4*N];

construir vacío (int Node, int st, int en) {

si(st==en) {

árbol[Node] = a[st];
devolver;
}

int medio = (st+en)/2;
build(2*Node, st, mid);
build(2*Node+1, medio+1, en);

árbol[Node] = árbol[2*Node] + árbol[2*Node+1];
}

 

Aplicaciones de los árboles de segmentos:

La estructura de datos del árbol de segmentos se puede utilizar para resolver varios problemas como:

  •  Consultas de rango mínimo, máximo y suma, y ​​consultas de actualización de rango
  •  árbol de segmentos con la compilación, consulta y actualización máximas.
  • árbol de segmentos con compilación mínima, consulta y actualización. 
  • Geometría computacional: La geometría computacional es un campo matemático que incluye el diseño y análisis de algoritmos eficientes para resolver problemas geométricos de E/S. También se utiliza para el reconocimiento de patrones y describe algoritmos de modelado sólido.
  • Sistemas de información geográfica: Un Sistema de Información Geográfica es un sistema que utiliza datos que se adjuntan a una ubicación única, y analiza y genera información geográficamente referenciada.
  • Almacenamiento de segmentos de manera arbitraria.

Ventajas y desventajas de los árboles de segmentos:

S.No   Ventajas Desventajas
1 No es necesario conocer la rotación de árboles porque en los casos de prueba se utiliza un algoritmo de divide y vencerás. La complejidad temporal de todas y cada una de las consultas es O(log^2 max(n))
2 Ejecución rápida de código en casos de prueba generales. El código fuente es más largo que la fuente usando un árbol balanceado.
3 Permite procesar consultas de intervalo o rango en tiempo logarítmico  

Tema relacionado: Árbol de segmentos

Publicación traducida automáticamente

Artículo escrito por sharmaaditya13064 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *