Este documento describe los conceptos básicos de los árboles y los algoritmos de búsqueda en árboles. Explica que un árbol es una estructura de datos formada por nodos conectados, con un nodo raíz y nodos hijos. También describe los algoritmos de búsqueda en anchura y profundidad para recorrer los nodos de un árbol y encontrar un elemento objetivo. Finalmente, presenta un ejemplo de código en Mathematica para implementar estas búsquedas en un k-árbol.
1. Universidad Nacional de Costa Rica
Curso: EIF-203 Estructuras Discretas
para Informática
Sub Grupo :8
Profesor Enrique Vílchez Quesada
2. un árbol es una estructura de datos ampliamente
usada que imita la forma de un árbol (un conjunto de
nodos conectados). Un nodo es la unidad sobre la
que se construye el árbol y puede tener cero o más
nodos hijos conectados a él. Se dice que un
nodo es padre de un nodo si existe un enlace
desde hasta (en ese caso, también decimos
que es hijo de ). Sólo puede haber un único nodo
sin padres, que llamaremos raíz. Un nodo que no
tiene hijos se conoce como hoja. Los demás nodos
(tienen padre y uno o varios hijos) se les conoce
como rama.
3. hay muchas maneras de generar árboles k. El sistema es:
Conforme se desciende en el árbol, se emplean ciclos a
través de los ejes para seleccionar los planos.
En cada paso, el punto seleccionado para crear el plano de
corte será la mediada de los puntos puestos en el árbol k, lo
que respeta sus coordenadas en el eje que está siendo
usado.
Este método lleva a un árbol k balanceado, donde cada
nodo hoja está a la misma distancia de la raíz. De todas
formas, los árboles balanceados no son necesariamente
óptimos para todas las aplicaciones.
4. Un Recorrido en un k- arbol son formas de
desplazamiento sobre cada uno de sus vertices,un
recorrido en un arbol,pasa una única vez por los nodos
que lo constituyen
5. Un árbol T es un árbol generador de un grafo G si T es
un subgrafo de G que contiene todos los vértices de G.
A esta característica general es posible agregar ciertos
teoremas de modo de detallar aún más el alcance de la
definición. Es así como el Grafo que contiene a T debe
ser conexo, pues de lo contrario no existiría un
subgrafo que contuviera todos sus vértices. En general
un grafo G tendrá varios árboles generadores ,como el
del ejemplo 1 el cual tiene a lo menos dos arboles
generadores T1 yT2.
6. Búsqueda en anchura (en inglés BFS - Breadth First Search) es
un algoritmo para recorrer o buscar elementos en
un grafo (usado frecuentemente sobre árboles). Intuitivamente,
se comienza en la raíz (eligiendo algún nodo como elemento raíz
en el caso de un grafo) y se exploran todos los vecinos de este
nodo. A continuación para cada uno de los vecinos se exploran
sus respectivos vecinos adyacentes, y así hasta que se recorra
todo el árbol.
Formalmente, LPA es un algoritmo de búsqueda sin información,
que expande y examina todos los nodos de un árbol
sistemáticamente para buscar una solución. El algoritmo no usa
ninguna estrategia heurística.
Si las aristas tienen pesos negativos aplicaremos el algoritmo de
Bellman-Ford en alguna de sus dos versiones.
7. Dado un vértice fuente s, Breadth-first search sistemáticamente
explora los vértices de G para “descubrir” todos los vértices
alcanzables desde s.
Calcula la distancia (menor número de vértices) desde s a todos
los vértices alcanzables.
Después produce un árbol BF con raíz en s y que contiene a
todos los vértices alcanzables.
El camino desde s a cada vértice en este recorrido contiene el
mínimo número de vértices. Es el camino más corto medido en
número de vértices.
Su nombre se debe a que expande uniformemente la frontera
entre lo descubierto y lo no descubierto. Llega a los nodos de
distancia k, sólo tras haber llegado a todos los nodos a distancia
k-1.
8. Una Búsqueda en profundidad (en inglés DFS
o Depth First Search) es un algoritmo que permite
recorrer todos los nodos de un grafo o árbol (teoría de
grafos) de manera ordenada, pero no uniforme. Su
funcionamiento consiste en ir expandiendo todos y
cada uno de los nodos que va localizando, de forma
recurrente, en un camino concreto. Cuando ya no
quedan más nodos que visitar en dicho camino,
regresa, de modo que repite el mismo proceso con cada
uno de los hermanos del nodo ya procesado.
9. Trata de un algoritmo donde No conocen el dominio
de problema solo saben una acción dada.
Como podremos ver acontuniacion con la solucion de
como realizar el algoritmo de busqueda a lo ancho y a
lo largo en un k-arbol
10. La siguiente implementación fue realizada para
Wólfram mathematica
11. <<Combinatorica`
h=0;
k=Input["Digite el orden del K-arbol:"];
n=Input["Digite la cantidad de vertices del K-arbol:"];
w=Input["Digite el dato de busqueda:"];
ShowGraph[G=CompleteKaryTree[n,k],VertexNumber
True,PlotRange 0.1]
v=DepthFirstTraversal[G,1,Edge];
For[i=1,i£ Length[v],If[wŠv[[i]],h=1;Break[]];i++]
If[h=0,Print["Dato no encontrado"],
Print["Dato encontrado"]]
AnimateGraph[G,v,VertexColor
Red,EdgeColor®Blue,VertexNumber True, PlotRange 0.1]
12. Donde para empezar se pide un orden
Cantidad de vértices del árbol k
Y el dato de búsqueda donde los datos se leen por
teclado
Para construir un k- árbol t con n nodos y determina si
una dato w esta en t mediante una comparación de
vértices, hallados por el algoritmo de recorrido a
profundidad (BPL)
13. Show graph: funciona para construir un grafo
CompleteKaryTree: forma un árbol binario completo
con n niveles
DepthFirstTraversal: realiza un recorrido de buscar
primero a lo largo
Animate graph: funciona para darle animación al
grafico (opcional )
14. <<Combinatorica`
h=0;
k=Input["Digite el orden del K-arbol:"];
n=Input["Digite la cantidad de vertices del K-arbol:"];
w=Input["Digite el dato de busqueda:"];
ShowGraph[G=CompleteKaryTree[n,k],VertexNumber
True,PlotRange 0.1]
v=BreadthFirstTraversal [G,1,Edge];
For[i=1,i£ Length[v],If[wŠv[[i]],h=1;Break[]];i++]
If[h=0,Print["Dato no encontrado"],
Print["Dato encontrado"]]
AnimateGraph[G,v,VertexColor
Red,EdgeColor®Blue,VertexNumber True, PlotRange 0.1]
15. En al caso de busqueda a lo ancho es exactamente
igual al recorrrido de profundidad el unico cambio es
la utilizacion del comando
Breathfristtraversal: que realiza en recorrido primero a
lo ancho
16. Si hay una solución la encuentra. Es mas si hay varias
encuentra la optima.
No se “pierde”, explorando caminos infructuosos que
consumen mucho tiempo sin llegar a una solución
Requiere mucho menos memoria
Puede encontrar el árbol sobre todo si hay varios
caminos a la solución.
17. Un claro ejemplo de arboles son los conocidos “arboles
genealógicos”
Otro ejemplo son los tipos de movimientos en el
ajedrez