Está en la página 1de 23

Índices. Árboles binarios.

M. Oscar F. D’Cuire Galeano


Objetivos
• Contrastar la utilización de índices versus la no
utilización de los mismos.
• Explicar el funcionamiento de los árboles
binarios y de los árboles binarios de búsqueda a
través de ejercicios prácticos.
Contenido
• Índices
– Primario
– Secundario
• Árboles binarios
• Indicaciones para el examen
Algunas consideraciones al
utilizar índices simples
• Un archivo de índices debe ser mas fácil de manejar ya que normalmente debería
ser mas pequeño que el archivo de datos.
• Debe tenerse cuidado al momento de definir el campo que será utilizado como llave.
Ejm. Si se el campo llave a utilizar será identidad, no puede definirse un campo con
5 caracteres.
• La idea de utilizar índices simples es hacerlo con archivos de datos que no tengan
demasiado información
– ¿Por qué? De esta manera el archivo de índice puede ser cargado en memoria
(haciendo que el acceso al mismo sea mas rápido)
• Para cargar el archivo en memoria se puede considerar la utilización de arreglo
INDICES[], con al menos dos columnas (llave, posición en el archivo).
• El tener el archivo en memoria nos permitirá acceder a él mas rápido y por ende
podremos detectar la dirección del registro y acceder mas rápido al archivo de datos
con el registro.
– Cada lenguaje de programación tiene sus comandos específicos para copiar
datos en memoria.
– Ejm. memcpy ( C )
Operaciones con índices
simples
• El trabajar con índices simples nos obliga a
analizar las siguientes operaciones:
1.Crear archivos originales de índices y de datos.
2.Cargar el archivo de índices en memoria antes
de usarlo.
3.Reescribir el archivo de índices cuando se realice
un cambio en memoria.
4.Agregar registros al archivo de datos e índices.
5.Eliminar registros del archivo de datos.
6.Actualizar registros del archivo de datos.
Creación de archivos originales
de índices y de datos
• Se deben crear los archivos como se hace
normalmente.
• Es una operación relativamente fácil.
• En el archivo de índices algunas veces se reservan los
primeros bytes para el “encabezado”
– Encabezado: información especial que define función de un
archivo, dentro de la cual se pueden citar algunos atributos:
cantidad de registros, última fecha de modificación, autor, etc…

ARCHIVO ARCHIVO
DATOS INDICE
Carga de archivos de índices en
memoria
• Utilizar un arreglo INDICES[] para copiar la información
del archivo de índices en memoria.
• Las funciones para copiar valores a memoria varían de
acuerdo al lenguaje de programación utilizado.
– Ejm. Memcpy (c++)

ARCHIVO
INDICE[ ]
INDICE
Reescritura del archivo de índices
después de realizar un cambio en
memoria
• Una vez que se haga alguna modificación en INDICES[]
se debe buscar el mecanismo para grabar esos cambios
en el archivo de índices.
• Prever que puede pasar en caso de interrupciones
eléctricas (incongruencia entre archivo de índices e
INDICES[])
– Buscar un método para reconstruir el archivo de índices a partir
del archivo de datos.
– Utilizar alguna bandera para indicar que INDICES[] y archivo
índices están sincronizados
ARCHIVO
INDICE
INDICE[ ]
Agregar nuevos registros
• Si se agregan registros al archivo de datos
debe agregarse un registro a INDICES[]
• Al modificar INDICES[] debe modificarse
también el archivo de índices.

ARCHIVO ARCHIVO
DATOS
INDICE[ ] INDICE
Eliminación de registros
• Utilizar las técnicas ya vistas (borrado
lógico / físico).
• El índice del registro también tiene que ser
afectado, primero eliminando el registro de
INDICES[], luego actualizando el archivo
de índices.
ARCHIVO ARCHIV
DATOS
INDICE[ ]
O INDICE
Actualización de registros
• Hay dos posibles escenarios:
– Modificar un campo que no es llave
• No afecta el índice
• Solo se modifica el archivo de datos.
– Modificar solo el campo llave
• Realizar el cambio en el archivo de datos
• Realizar el cambio en INDICE[]
• Reacomodar INDICE[] si fuera necesario
• Actualizar el archivo de índices con los cambios
• Ejm. Si en el ejemplo se modifica el registro con la llave
4146165, con la nueva llave 58541010 INDICE[] y el
archivo de índices deberían de pasar de:

Se cambia el valor de la
llave y se reacomoda el
archivo de índices. La
posición del registro no
cambia.
Índices Secundarios
• Surgen como una opción cuando se tienen archivos
con grandes volúmenes de información.
• Cuando se busca un libro en una biblioteca le
decimos a la bibliotecaria ¿Tiene el libro de
estructura de datos ? le decimos ¿Tiene el libro
código CD4587986X-23?
• Por lo general no buscamos la información por llaves
primarias, si no por descriptores que pueden ser
nombres o palabras clave. Esto es lo que se conoce
como llaves secundarias.
Indices Secundarios
• Para implementar un índice secundario,
agregamos a la estructura de índice
primario o simple un tercer archivo:
archivo de índice secundario.
Índice
Índice Primario:
Secundario: ordenado
ordenado por código
por ciudad

Datos: en
desorden
Indices Secundarios
• El índice secundario se compone de:
– Clave secundario (un campo que no necesariamente identifica
exclusivamente a un registro y cuyo valor puede repetirse en varios
registros)
– Llave primaria (identificador único de cada registro)
• Algunas operaciones con índices secundarios:
– Agregar registros: también hay que agregar el nuevo registro en el
archivo de índices primario y en el archivo de índice secundario
– Eliminar registros: se debe eliminar del archivo de índices y del
secundario, para ambos casos hay que reacomodar el archivo.
– Actualizar registros:
• Campo no llave: solo afecta archivo de datos.
• Campo llave secundaria: afecta archivo de datos, y archivo de índice secundario.
Este último debe reacomodarse.
• Campo llave primaria: afecta archivo de datos, archivo de índice primario y archivo
de índice secundario. Los dos deben reacomodarse
Desventajas de los índices
secundarios
• Hay que reacomodar el archivo secundario cada
vez que se inserte un nuevo registro al archivo de
datos, aún y cuando ya haya algún registro que
tenga esa llave secundaria.
– Si hay llaves secundarias duplicadas, el campo de
llave secundaria se repite para cada registro en el a.
de índices secundarios. Esto desperdicia el espacio y
dificulta que sea cargado en memoria.
• Una solución puede ser:
– Cambiar la estructura del índice secundario
– Asociar un arreglo de referencias con cada llave
secundaria.
Asociando varias claves
primarias a una llave
• Siguiendo el ejemplo
secundaria

• Algunos problemas con esta implementación:


– Hay un número limitado de llaves primarias por cada secundaria.
– ¿Qué pasaría si se ingresa un nuevo registro con la clave secundaria TEG?
• Habría que buscar la manera de enlazar ese nuevo registro y los subsiguientes con el
registro actual con los cuatro códigos iniciales.
– Hay desperdicio de espacio, ya que para las llaves secundarias CHO, LCE, PRO,
SPS hay 2, 2, 3 y 3 espacios sin utilizar.
Índice secundario
reestructurado
• Una solución para esto es implementar el índice
secundario a través de una lista invertida.
• Son listas invertidas porque “retrocedemos” del
índice secundario al primario, y de éste al dato.
• Es una estructura dinámica donde se tiene un
apuntador a la primera referencia de llave
primaria.
Ejercicio
• Considere el siguiente problema:
– Una tienda de abarrotería cuenta con al menos mil productos. Históricamente se han
almacenado algunos datos relacionadas con las ventas de productos dentro de la
tienda. Se dispone de la información de cada factura de cada cliente. Considere que
en una factura un cliente puede tener registrado uno o mas productos.
– El dueño de la tienda está interesado en conocer la siguiente información:
• Detalle de facturas para un cliente en particular
• Información de un cliente (código de cliente, nombre, ultima factura)
• Cantidad de facturas para un cliente en particular
• Cantidad de un producto en particular, total de venta de ese producto en una factura en
particular
• Cantidad de producto vendido para todos los clientes
• Cantidad de producto vendido, total de ventas para un cliente en particular
– En vista de lo anterior, se pide:
• Identificar posibles datos de un archive de datos (campo / tipo de datos (varchar, int, float,
etc..)) Asuma que todos los datos se almacenan en un solo archivo.
• Identificar posibles índices primarios
• Identificar posibles índices secundarios
• ¿De que manera utilizaría los índices para realizar las consultas mencionadas en la primer
parte del problema? Ventajas / Desventajas del índice seleccionado
• ¿De que otra manera podrían organizarse la información si el archivo de datos se distribuyera
en dos o mas archivos? ¿Cómo cambian los índices?
Estructuras de índices
marca

ubicación

codigo
codigo
nombre proveedor
cantidad ubicación
marca
ubicación
Mejorando la búsqueda en
archivos
• Los índices simples son efectivos con un volumen de
información manejable.
• Cuando el volumen de información es demasiado grande, no se
puede copiar el índice en memoria.
• Mantener un índice simple en disco no es efectivo:
– Ingresos constantes
– Al eliminar registros hay que eliminar espacios
• Los registros del índice no pueden ser borrados lógicamente
– Las búsquedas binarias requieren demasiados accesos
• Varios I/O en disco para encontrar un registro
• Con el fin de mejorar el desempeño en lo que respecta al
manejo de índices, introducimos el manejo de árboles.
60

50 80
Árboles
40 100 Figura 3

20
Figura 1

100

60 80

40 20 70 50

Figura 5
Figura 2

1 2 3 4 5
Árbol binario
Árbol no binario
Árbol binario de
búsqueda
Montículo
Árbol balanceado
• 19 de mayo – 26 de mayo
– Prueba Primer Parcial
• 19 de mayo
Actividades
Pendientes – Examen I Parcial Presencial TGU
y SPS
• 19 de mayo
– Tarea Formativa 1 / Wiki / Tarea
Formativa 3
• 20 de mayo
– Tarea Formativa 4
• 21 de mayo
– Tarea # 4
• 22 de mayo
– Proyecto de Clase

También podría gustarte