Vous êtes sur la page 1sur 6

UNIVERSIDAD TCNICA DE AMBATO

FACULTAD DE INGENIERA EN SISTEMAS, ELECTRNICA E INDUSTRIAL


CARRERA DE INGENIERA EN SISTEMAS COMPUTACIONALES E INFORMTICOS
PERODO ACADMICO: MARZO 2017 / SEPTIEMBRE 2017

FORMATO DE TRABAJO

I. PORTADA
UNIVERSIDAD TCNICA DE AMBATO
Facultad de Ingeniera en Sistemas, Electrnica e Industrial
Proyecto Acadmico de Semestre
Ttulo: rbol de segmento
Carrera: Ingeniera en Sistemas
rea Acadmica: Redes
Lnea de Investigacin: Software y base de datos
Nivel y Paralelo: Tercero A
Alumnos participantes: Escobar Montenegro Leonel Fabricio
Guerrn Chiluisa Bryan Andrs
Supe Jonathan

Mdulo y Docente: Estructura de datos PhD. Flix scar

II.
1. PP
INFORME DEL PROYECTO
2. YY

2.1 Ttulo
rbol de segmento
2.2 Objetivos
General
Explicar los rboles de segmento de la asignatura estructura de datos
Especficos:
Investigar sobre los rboles de segmento
Conocer las diferentes operaciones que pueden realizar
Aplicar la estructura de los rboles de segmento en la carrera
2.3 Resumen

2.4 Palabras clave: (rboles de segmento, intervalos, modificar, almacenamiento)

2.5 Introduccin

2.6 Materiales y Metodologa


rboles de segmento?
Es una estructura de datos que permite almacenar informacin en forma de
intervalos o segmentos; incluso es una estructura esttica, es decir, que su
contenido no puede ser modificado una vez que su estructura es construida. Fue
descubierto por J. L. Bentley en 1977, adems permite realizar diferentes
operaciones sobre la informacin de los intervalos:
https://users.dcc.uchile.cl/~jsaavedr/files/EsDatos.pdf
Consultar
Modificar elemento
Modificar todos los elementos de un intervalo
Algunas de las aplicaciones de rbol de segmento son vistos en reas de geometra
computacional y en sistemas de informacin geogrfica, incluso los rboles de
segmentos se pueden generalizarse como espacios multidimensionales.
https://es.wikipedia.org/wiki/%C3%81rbol_de_segmento

Para lograr determinar su funcionalidad con respecto a la informacin almacenada


en l, se realizar las siguientes operaciones con los siguientes datos. Se supone
que si se tuviese el siguiente arreglo [5, 2, 4, 6, 11, 8, 3, 2] las operaciones a llevarse a
cumplir son las siguientes:
Determinar el menor elemento en el intervalo [i, j]
UNIVERSIDAD TCNICA DE AMBATO
FACULTAD DE INGENIERA EN SISTEMAS, ELECTRNICA E INDUSTRIAL
CARRERA DE INGENIERA EN SISTEMAS COMPUTACIONALES E INFORMTICOS
PERODO ACADMICO: MARZO 2017 / SEPTIEMBRE 2017

Cambiar el elemento en la posicin k

Este problema se resuelve usando el rbol de segmento o Segment Tree en O (log


n) para cada operacin, primero para esto se debe definir una estructura en forma
de rbol binario, donde en cada nodo debe llevar la informacin correspondiente al
intervalo [l, r]. En el hijo izquierdo de este nodo se almacenar la informacin del
intervalo [l, (l + r) /2] y en el hijo derecho [(l + r) /2+1, r] donde la raz del rbol
representa el intervalo completo:
https://prodeportiva.wordpress.com/2013/02/08/segment-trees/

Construccin del rbol

El nodo contiene informacin sobre el intervalo que representa y el valor que se tiene
en ese intervalo como mnimo. La operacin merge calcula el valor del nodo a partir
de los valores de los hijos. En este caso, se almacena en cada nodo el menor valor
que aparece en el intervalo que representa ese nodo. El rbol puede ser
representado como un arreglo de Nodo donde cada posicin i, indica un nodo en el
rbol y la posicin 2i representa el hijo izquierdo de este nodo, y la posicin 2i+1, el
hijo derecho. Este arreglo tiene un tamao proporcional al tamao del arreglo
original. No es difcil calcular que el mayor tamao que se necesita para guardar el
rbol es 2^(log2(n)+1), donde n es la cantidad de elementos en el arreglo original.
Luego para construir el rbol de manera recursiva. La idea general es llegar primero
hasta las hojas y luego regresar el camino hasta la raz calculando el valor de los
nodos padres. http://wcipeg.com/wiki/Segment_tree

1 class SegmentTree

2 {

3 int N;

4 Node[] tree;

public SegmentTree(int[] A)
5
{
6
N = A.length;
7
int power = (int) Math.floor(Math.log(A.length) /
8 Math.log(2)) + 1;

9 int len = (int) 2 * Math.pow(2, power);


UNIVERSIDAD TCNICA DE AMBATO
FACULTAD DE INGENIERA EN SISTEMAS, ELECTRNICA E INDUSTRIAL
CARRERA DE INGENIERA EN SISTEMAS COMPUTACIONALES E INFORMTICOS
PERODO ACADMICO: MARZO 2017 / SEPTIEMBRE 2017

10 tree = new Node[len];

11 build(1, 0, A.length-1, A);

}
12
private void build(int node, int l, int r, int[] A)
13
{
14
if (l == r) // nodo hoja
15
{
16
tree[node] = new Node(l, r);
17 tree[node].value = A[l];

18 return;

19 }

20 int leftChild = node*2, rightChild = leftChild+1, mid =


(l+r)/2;
21
build(leftChild, l, mid, A); // calcular el valor del
22hijo izquierdo
build(rightChild, mid + 1, r, A); // calcular el valor del
23
hijo derecho
24 tree[node] = new Node(l, r);

25 tree[node].merge(tree[leftChild], tree[rightChild]);

26 }

27}

De esta manera, el rbol queda construido en O(n) y se puede comenzar a


responder las consultas sobre el menor elemento en un intervalo.

Consultando los intervalos

La operacin query responde con recorrer el camino de la raz hacia las hojas. Si se
llega a preguntar por el menor elemento en el intervalo [2, 5] se visitar en el rbol
UNIVERSIDAD TCNICA DE AMBATO
FACULTAD DE INGENIERA EN SISTEMAS, ELECTRNICA E INDUSTRIAL
CARRERA DE INGENIERA EN SISTEMAS COMPUTACIONALES E INFORMTICOS
PERODO ACADMICO: MARZO 2017 / SEPTIEMBRE 2017

solamente los nodos cuyos intervalos contengan total o parcialmente este intervalo.
La secuencia de operaciones es la siguiente:

1.- Comenzamos en la raz [0, 7]. Como contiene al intervalo, vamos a visitar sus
hijos recursivamente.
1.- Visitamos [0, 3]. Como contiene parte del intervalo, visitamos sus hijos
recursivamente.
1.- [0,1] no est en el intervalo, retornamos.
2.- [2, 3] est incluido completamente en el intervalo de consulta,
retornamos su valor.
2.- [4, 7]. Contiene parte del intervalo, visitamos sus hijos.
1.- [4, 5] est contenido completamente en el intervalo de consulta,
retornamos su valor.
2.- [6, 7] no est dentro del intervalo, retornamos.

Combinando la informacin de todos los nodos visitados se tendr el resultado.


Con esta estrategia, el mtodo query quedara de la siguiente manera:
https://comeoncodeon.wordpress.com/2009/09/15/segment-trees/

1 private Node query(int node, int l, int r, int i, int j)


2 {
3 if (l >= i && r <= j) return tree[node]; // dentro del intervalo
4 else if (j < l || i > r) return null; // fuera del intervalo
else // parcialmente dentro
5 {
6 int leftChild = 2*node, rightChild = leftChild+1, mid =
7 (l+r)/2;
8 Node a = query(leftChild, l, mid, i, j); // visitar hijo
9 izquierdo
Node b = query(rightChild, mid+1, r, i, j); // visitar hijo
10derecho
11 Node temp = new Node(-1, -1); // combinamos la informacion
12 temp.merge(a, b);
13 return temp;
}
14}
15public int query(int i, int j)
16{
17 Node result = query(1, 0, N-1, i, j);
18 return result.value;
}
19

Cambiar un elemento
UNIVERSIDAD TCNICA DE AMBATO
FACULTAD DE INGENIERA EN SISTEMAS, ELECTRNICA E INDUSTRIAL
CARRERA DE INGENIERA EN SISTEMAS COMPUTACIONALES E INFORMTICOS
PERODO ACADMICO: MARZO 2017 / SEPTIEMBRE 2017

La operacin de cambiar un elemento en el arreglo se puede realizar recorriendo el


camino desde la raz hasta el nodo hoja que corresponde al elemento que se desea
cambiar, y luego el camino de regreso hacia la raz actualizando los valores de todos
los padres usando la operacin merge:
http://letuskode.blogspot.com/2013/01/segtrees.html

1
private void update(int node, int l, int r, int i, int v)
2 {
3 if (l == i && l == r) tree[node].value = v; // nodo hoja
4 else if (i < l || i > r) return; // fuera del intervalo
5 else // parcialmente dentro
{
6 int leftChild = 2*node, rightChild = leftChild+1, mid =
7 (l+r)/2;
8 update(leftChild, l, mid, i, v); // visitar hijo
9 izquierdo
10 update(rightChild, mid+1, r, i, v); // visitar hijo derecho
tree[node].merge(tree[leftChild], tree[rightChild]);
11 }
12}
13public void update(int i, int newValue)
14{
update(1, 0, N-1, i, newValue);
15}
16

2.7 Resultados y Discusin


La consulta que pregunta por todos los intervalos que contienen un punto dado, es
a menudo referida como stabbing query.

El rbol de segmento es menos eficiente que el rbol de intervalo para consultas


con rangos en una dimensin, debido a su requisito de almacenamiento ms alto:
O(n log n) en contra del O(n) del rbol de intervalo. Lo importante del rbol de
segmento es que los segmentos dentro del subconjunto cannico de cada nodo
pueden ser almacenados de cualquier manera arbitraria.

Para n intervalos cuyos puntos finales estn en el rango de un entero pequeo (small
integer), existe una estructura de datos ptima con un tiempo de procesamiento
lineal y un tiempo de consulta O(1+k) para reportar todos los k intervalos que
contienen al punto de consulta dado.

Otra ventaja del rbol de segmento es que puede ser fcilmente adaptado para
consultas de cantidad; esto es, reportar el nmero de segmentos que contienen un
punto dado, en lugar de reportar todos los segmentos. En lugar de guardar los
intervalos en subconjuntos cannicos, puede simplemente guardar el nmero de
ellos. Semejante rbol de segmento usa almacenamiento lineal y requiere un tiempo
de consulta O (log n), as que es ptimo.
http://p--np.blogspot.com/2011/07/segment-tree.html

2.8 Conclusiones
Se concluye que Segment Tree es una estructura muy verstil y se puede
generalizar fcilmente para soportar distintas operaciones.

2.9 Referencias bibliogrficas


UNIVERSIDAD TCNICA DE AMBATO
FACULTAD DE INGENIERA EN SISTEMAS, ELECTRNICA E INDUSTRIAL
CARRERA DE INGENIERA EN SISTEMAS COMPUTACIONALES E INFORMTICOS
PERODO ACADMICO: MARZO 2017 / SEPTIEMBRE 2017

2.10. Fotografas y grficos