La utilización de estructuras de datos adecuadas para cada problema hace que se simplifiquen en gran medida los tiempos de respuestas y la cantidad de cómputo realizada.
Por Nelson González
3. “...una estructura de datos
es una colección de
valores de datos, las
relaciones entre ellos y las
funciones u operaciones
que se pueden aplicar a
los datos.”
Enciclopedia de Ciencias de la ComputaciónEstructura de datos
4. ¿Qué hace que una herramienta sea eficaz?
¿Qué nos puede ayudar a elegir la herramienta adecuada?
5. Índices en las bases de datos
Un índice de base de datos es una estructura de datos que mejora la velocidad
de las operaciones de recuperación de datos en una tabla a costa de escrituras y
espacio de almacenamiento adicionales.
CREATE INDEX index_name ON table_name (column_name) USING HASH;
CREATE INDEX index_name ON table_name (column_name) USING BTREE;
6. Índices en las bases de datos
Un índice de base de datos es una estructura de datos que mejora la velocidad
de las operaciones de recuperación de datos en una tabla a costa de escrituras y
espacio de almacenamiento adicionales para mantener la estructura del índice.
Sistemas hash B-tree (y variantes)
Las dos estructuras más utilizadas para organizar grandes bases de datos
almacenadas en disco son:
7. Sistema hash
tabla hash
(llave, valor)
función hash
hash
0 1 2 … m - 1
slot
resolución
de colisiones lista<llave, valor>
Inserción
Borrado
Búsqueda
operaciones
8. Sistema hash
No son buenos cuando
● Se permiten varios registros con
la misma llave
● Se pretende buscar por rangos
● Se pretende buscar mínimos o
máximos
● Se pretende recorrer en un orden
9. Sistema hash
Son buenos cuando
● Se pretende responder ¿Qué
registro, si lo hay, tiene llave K?
Para estos casos, el hash debe ser la
elección porque cuando se implementa
correctamente lleva a cabo sus
operaciones en tiempo constante.
10. B-Tree
Sus variantes B+
-Tree y B*-Tree
Los árboles B-Trees, o alguna de sus
variantes, son la estructura de datos
estándar para la organización de
archivos en aplicaciones que
requieren inserción, eliminación y
búsquedas de rango de claves.
El B-tree es una generalización del 2-3-Tree
https://en.wikipedia.org/wiki/2-3_tree
11. B-Tree
Características
● Las operaciones de actualización y
búsqueda afectan solo a unos
pocos bloques de disco
● Mantienen registros relacionados
en el mismo bloque de disco
● Garantizan que todos los nodos del
árbol estarán llenos al menos hasta
un cierto porcentaje mínimo. Esto
mejora la eficiencia del espacio
13. B-Tree
Propiedades de un B-Tree de
orden m
La raíz es una hoja o tiene al menos
dos hijos.
24 24 49 24 4936
36
24 49 67
a) b) c)
d)
14. B-Tree
Propiedades de un B-Tree de
orden m
Todas las hojas están al mismo nivel
en el árbol, por lo que el árbol siempre
está equilibrado en altura.
24 24 49 24 4936
36
24 49 67
a) b) c)
d)
15. B-Tree
Búsqueda
● Realice una búsqueda binaria en
los elementos del nodo actual.
○ Si se encuentra un elemento con la
clave de búsqueda, devuelva ese
registro.
○ Si el nodo actual es un nodo hoja y
no se encuentra la clave, es una
búsqueda fallida.
● De lo contrario, siga la rama
adecuada y repita el proceso.
16. B-Tree
Búsqueda
Se examina la raíz en búsqueda del primer
elemento mayor o igual a la clave
Ejemplo de búsqueda de la clave 47
Al no encontrarse el elemento, la rama de la
derecha es seleccionada
En el hijo derecho no se encuentra el elemento y
se selecciona la rama adecuada para descender
Se analiza el nodo hoja correspondiente y se
encuentra la clave
17. B-Tree
Inserción
● Encontrar el nodo hoja que debe
contener la clave a insertar
○ Si tiene espacio para insertar la
clave, se inserta manteniendo el
orden.
○ Si no tiene espacio se divide el nodo
en dos y se promueve la clave del
medio al padre, manteniendo el
orden. Insertando el elemento en uno
de los dos nodos resultantes.
■ Si el padre no tiene espacio, se
divide también y se aplica la
misma operación.
24 24 49 24 4936
36
24 49 67
a) b) c)
d)
18. B-Tree
Generalidades
Generalmente el orden del B-Tree (m)
es igual o mayor a 100 porque con
cada nodo se intenta llenar un bloque
de disco, intentando reducir las
operaciones de lectura y escritura y a
su vez la altura del árbol.
19. B+
-Tree
La diferencia más significativa con
el B-Tree es que el B+
-Tree solo
almacena registros en los nodos
hojas.
Los nodos internos solo almacenan
las claves y sirven únicamente para
guiar la búsqueda.
Los nodos hojas están enlazados
entre sí para formar una lista
doblemente enlazada.
20. B+
-Tree
Búsqueda
Es similar que en el B-Tree con la
diferencia que siempre debe
descender obligatoriamente hasta
el nodo hoja correspondiente.
21. B+
-Tree
Inserción
Es similar que en el B-Tree con la
diferencia que si se necesita dividir
un nodo hoja en dos, lo que se
promueve hacia el nodo padre es
una copia y no se retira la clave de
su lugar.
Insertar registro
con clave 30
22. B+
-Tree
Observación
Requiere que todos los nodos estén
al menos medio llenos (excepto la
raíz). Por tanto, la utilización del
almacenamiento debe ser al menos
del 50%.
23. Es similar al B+
-Tree, excepto por
las reglas utilizadas para dividir y
fusionar nodos. En lugar de dividir
un nodo por la mitad cuando se
llena, el B*-Tree le da algunos
registros a su hermano vecino, si es
posible. Si el hermano también está
lleno, estos dos nodos se dividen
en tres.
B*
-Tree
24. B-Trees
Análisis
El costo asintótico de búsqueda,
inserción y eliminación de registros
de B-Trees, B+
-Trees y B*-Trees es Θ
(log n) donde n es el número total de
registros en el árbol. Sin embargo, la
base del logaritmo es el factor de
ramificación (promedio) del árbol.
26. B-Tree
Análisis
Como ilustración consideremos un
B+
-Tree de orden 100 y nodos hojas
de hasta 100 registros. Cuando el
árbol tenga altura:
1: puede tener hasta 100 registros
2: hasta 10 000 registros
3: hasta 1 000 000 de registros
4: hasta 100 000 000 de registros
27. Índices en las bases de datos
Un índice de base de datos es una estructura de datos que mejora la velocidad
de las operaciones de recuperación de datos en una tabla a costa de escrituras y
espacio de almacenamiento adicionales para mantener la estructura del índice.
CREATE INDEX index_name ON table_name (column_name) USING HASH;
CREATE INDEX index_name ON table_name (column_name) USING BTREE;
28.
29. Trie
Un Trie nos permite buscar palabras que tienen un simple caracter diferente, un
prefijo en común, un caracter faltante, etc.
Pueden insertar y encontrar cadenas en tiempo O (L) (siendo L la longitud de la
cadena). Esto es mucho más rápido que un set, pero es solo un poco más rápido
que una tabla hash.
30. Trie
Aplicaciones en ingeniería de
software
Los navegadores pueden auto
completar tu texto o sugerir
posibilidades de lo que puedes estar
escribiendo.
El corrector ortográfico puede buscar
si cada palabra que escribes está en
el diccionario.
31. Trie
Aplicaciones en ingeniería de
software
También se pueden sugerir
correcciones de palabras que están
en el texto pero no en el diccionario.
Se pueden sugerir palabras que
comienzan con el texto que estás
escribiendo.
32. Trie
¿Qué es?
Es un árbol donde cada nodo
representa una palabra o un prefijo.
El nodo raíz representa una cadena
vacía (“”).
Cada nodo puede tener hasta tantos
hijos como el tamaño del alfabeto que
se quiere usar.
33. Trie
¿Qué es?
Los nodos que son hijos directos de
la raíz, representan prefijos de
longitud 1, los que están a 2 aristas
de distancia de la raíz son prefijos de
longitud 2 y así sucesivamente.
36. Trie
Métodos a implementar
add_word: Agrega una palabra al
diccionario.
count_possible_words: Cuenta el
número de palabras que tienen una
cadena como prefijo.
count_words: Cuenta el número de
palabras que coincide exactamente
con una palabra dada.
37. Trie
Estructura de un nodo
1 class trie {
2 int prefixes;
3 int ending_words;
4 trie* nodes[ 27];
5
6 public:
7 trie(){
8 prefixes = 0;
9 ending_words = 0;
10 for(int i = 0; i < 27; i++){
11 nodes[i] = NULL;
12 }
13 }
38. Trie
Método para agregar una
palabra
1 void add_word(string word) {
2 trie* current = this;
3 for(int i=0; i < word.size(); i++){
4 int pos = word[i]-'a';
5 if(current->nodes[pos] == NULL){
6 current->nodes[pos] = new trie();
7 }
8 current->prefixes++;
9 current = current->nodes[pos];
10 }
11 current->ending_words++;
12 }
39. Trie
Método para saber la cantidad
de palabras que que son
exactas a una palabra dada
1 int search_word(string word){
2 trie* current = this;
3 for(int i=0; i < word.size(); i++){
4 int pos = word[i]-'a';
5 if(current->nodes[pos] == NULL){
6 return 0;
7 }
8 current = current->nodes[pos];
9 }
10 return current->ending_words;
11 }
40. Trie
Método para saber la cantidad
de palabras que se pueden
sugerir dado un prefijo
1 int search_possible_words(string prefix){
2 trie* current = this;
3 for(int i=0; i < prefix.size(); i++){
4 int pos = prefix[i]-'a';
5 if(current->nodes[pos] == NULL){
6 return 0;
7 }
8 current = current->nodes[pos];
9 }
10 return current->prefixes;
11 }
41. Trie
Repositorio con el ejemplo
anterior
https://github.com/npenate/advanced-
data-structures
42. Trie
Jueces en línea
Sphere Online Judge:
https://www.spoj.com/problems/tag/trie-1
Un problema clásico donde se debe
usar la estructura de datos Trie.
43. Suffix Tree
Es un Trie comprimido que contiene
todos los sufijos de un texto como sus
claves y las posiciones en el texto
como sus valores.
Tiene aplicaciones en el campo de la
Bioinformática buscando patrones de
ADN o secuencias de proteínas.
https://www.spoj.com/problems/NEXTLEX/
https://www.spoj.com/problems/LCS/https://
www.spoj.com/problems/DISUBSTR/
44. Casos de uso reales
Estructuras de
datos avanzadas