You are on page 1of 12

30/05/13

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes

Home

Blog

Sguenos

Concenos

Contacto

Escribe aqu para buscar...

Rogue AP con karmetasploit

Obteniendo informacin de dispositivos Android con Metasploit

Bsqueda en anchura y bsqueda en profundidad para rboles


Publicado el 16 septiembre, 2011 por meta En programacin es muy comn usar Estructuras de Datos para poder ordenar y almacenar informacin. sta puede ser desde primitivas como nmeros enteros hasta cadenas de texto hasta tipos definidos por el programador como productos, personas o estados de un juego. Existen diversas Estructuras de Datos entre las cuales estn los arrays, las listas, las colas, las pilas, los conjuntos, los rboles, los grafos En esta entrada vamos a centrarnos en los rboles y en los dos algoritmos de bsqueda ms sencillos que podemos usar en ellos: la bsqueda en anchura y la bsqueda en profundidad. Comencemos entonces. Un rbol es una estructura de datos compuesta por nodos y ramas. Un nodo es un elemento, el dato que queremos organizar. Una rama es una unin dirigida entre un par de nodos. Un nodo se dice que es padre si existe alguna rama que le una con otro nodo, del mismo modo que un nodo es hijo si existe una rama que una a otro nodo con ste. Decimos que un nodo es hoja si no tiene hijos. Un grafo es una generalizacin de un rbol. Para entenderlo mejor, consultemos la siguiente figura:

FuncionDeVisual Basic
www.3ct.mx AprendeVisualBasicCurso completocursopresencialen MxicoDF,

Categoras
Android Curso introduccin Android Programacin Seguridad Sistemas Operativos

Entradas recientes
Colorshapes, el juego de velocidad mental y figuras de colores para Android eyeOS: Trabajando en la nube Integrando Google Analytics en aplicaciones Android Integrando Twitter en aplicaciones Android con SignPost y Twitter4J Entrenando con

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

1/12

30/05/13

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes

Metasploitable (IV). Desde postgres a ssh, pasando por openSSL

Etiquetas

activity algoritmo android aplicacion android arbol backtrack bash BD


acelerometro
BEeF

canvas contraseas csrf

dns dns spoof

eclipse

expresiones regulares

graficos android
graphics android htc

desire intent java


javascript layout menu

metasploit
Como toda estructura de datos, los rboles tienen tres operaciones bsicas: Insercin de nuevos elementos. Eliminacin de elementos existentes. Bsqueda de un elemento en la estructura. Existen otras operaciones como la ordenacin y la mezcla de dos estructuras de datos del mismo tipo, pero no vamos a tratarlas aqu. Durante el resto de la entrada vamos a utilizar el siguiente rbol:

metasploitable mitm mysql oauth owasp pentesting


php seguridad por defecto
shodan smartphones SQL

trasteando twitter twitter4j VirtualBox wireshark xml xss persistente


SQLi

Sitios de inters
Android Developers Android.es Backtrack Command Line Kung Fu DragonJAR El Androide Libre Exploits Database Flu Project Gran Angular Hispasec Microsiervos OpenLibra Pentester.es Poesa Binaria Security By Default Un informtico en el lado del mal World Wide Web Consistorium

Comenzamos por tanto, construyendo los tipos de datos necesarios para representar este rbol. En esta ocasion voy a elegir Java como lenguaje de programacin por disponer de tipos de datos predefinidos que nos van a ayudar, ya que por ejemplo en C tendramos que crearnos diversos tipos de datos (los cuales veremos ms adelante) que pertenecera a una entrada sobre estructuras de datos y su construccin, y no de algoritmos de bsqueda.

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

2/12

30/05/13

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes

Lo primero ser crear nuestra clase NodoArbol, la cual va a representar un nodo de nuestro rbol (duh). En nuestro caso vamos a usar como elemento de cada nodo un carcter, para hacerlo simple. Sin embargo podramos tambin usar otras primitivas o nuestros propias clases. Y adems vamos a aceptar que cada nodo pueda tener entre 0 y N hijos, de modo que querremos algn tipo de lista dinmica para almacenarlo (ya que no sabemos inicialmente cuntos hijos habr por nodo). El cdigo de la clase comienza siendo el siguiente:
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 p u b l i c c l a s s N o d o A r b o l { p r i v a t e c h a r e l e m e n t o p r i v a t e L i s t < N o d o A r b o l > h i j o s p u b l i c N o d o A r b o l ( c h a r e l e m e n t o ) { t h i s . e l e m e n t o = e l e m e n t o h i j o s = n e w A r r a y L i s t < N o d o A r b o l > ( ) } p u b l i c c h a r g e t E l e m e n t o ( ) { r e t u r n e l e m e n t o } p u b l i c v o i d a d d H i j o ( N o d o A r b o l h i j o ) { h i j o s . a d d ( h i j o ) } p u b l i c L i s t < N o d o A r b o l > g e t H i j o s ( ) { r e t u r n h i j o s } p u b l i c b o o l e a n e s N o d o H o j a ( ) { r e t u r n h i j o s . s i z e ( ) > 0 } }

Adems de los atributos que hemos mencionado, aadimos funcionalidad para obtener el elemento del nodo actual y los hijos de dicho nodo, adems de la opcin de insertar hijos al nodo y de consultar si es un nodo hoja. Ahora crearemos nuestra clase principal, desde la que vamos a ejecutar las pruebas:
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 p u b l i c c l a s s A r b o l e s B u s q u e d a s { p u b l i c s t a t i c v o i d m a i n ( S t r i n g [ ] a r g s ) { / / c r e a r n o d o s N o d o A r b o l r a i z = n e w N o d o A r b o l ( ' v ' ) / / p r i m e r n i v e l N o d o A r b o l n i v e l 1 h i j o 0 = n e w N o d o A r b o l ( ' i ' ) N o d o A r b o l n i v e l 1 h i j o 1 = n e w N o d o A r b o l ( ' o ' ) N o d o A r b o l n i v e l 1 h i j o 2 = n e w N o d o A r b o l ( ' r ' ) / / s e g u n d o n i v e l N o d o A r b o l n i v e l 2 h i j o 0 = n e w N o d o A r b o l ( ' d ' ) N o d o A r b o l n i v e l 2 h i j o 1 = n e w N o d o A r b o l ( ' c ' ) N o d o A r b o l n i v e l 2 h i j o 2 = n e w N o d o A r b o l ( ' n ' ) N o d o A r b o l n i v e l 2 h i j o 3 = n e w N o d o A r b o l ( ' r ' ) N o d o A r b o l n i v e l 2 h i j o 4 = n e w N o d o A r b o l ( ' e ' ) N o d o A r b o l n i v e l 2 h i j o 5 = n e w N o d o A r b o l ( ' e ' ) / / t e r c e r n i v e l N o d o A r b o l n i v e l 3 h i j o 0 = n e w N o d o A r b o l ( ' a ' ) N o d o A r b o l n i v e l 3 h i j o 1 = n e w N o d o A r b o l ( ' s ' ) N o d o A r b o l n i v e l 3 h i j o 2 = n e w N o d o A r b o l ( ' c ' ) N o d o A r b o l n i v e l 3 h i j o 3 = n e w N o d o A r b o l ( ' u ' ) N o d o A r b o l n i v e l 3 h i j o 4 = n e w N o d o A r b o l ( ' n ' ) N o d o A r b o l n i v e l 3 h i j o 5 = n e w N o d o A r b o l ( ' t ' ) N o d o A r b o l n i v e l 3 h i j o 6 = n e w N o d o A r b o l ( ' s ' ) / / c o n s t r u i r e l a r b o l r a i z . a d d H i j o ( n i v e l 1 h i j o 0 ) r a i z . a d d H i j o ( n i v e l 1 h i j o 1 ) r a i z . a d d H i j o ( n i v e l 1 h i j o 2 ) / / p r i m e r n i v e l n i v e l 1 h i j o 0 . a d d H i j o ( n i v e l 2 h i j o 0 ) n i v e l 1 h i j o 0 . a d d H i j o ( n i v e l 2 h i j o 1 ) n i v e l 1 h i j o 1 . a d d H i j o ( n i v e l 2 h i j o 2 )

3 8 n i v e l 1 h i j o 2 . a d d H i j o ( n i v e l 2 h i j o 3 )

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

3/12

30/05/13
3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes


n i v e l 1 h i j o 2 . a d d H i j o ( n i v e l 2 h i j o 4 ) n i v e l 1 h i j o 2 . a d d H i j o ( n i v e l 2 h i j o 5 ) / / s e g u n d o n i v e l n i v e l 2 h i j o 0 . a d d H i j o ( n i v e l 3 h i j o 0 ) n i v e l 2 h i j o 0 . a d d H i j o ( n i v e l 3 h i j o 1 ) n i v e l 2 h i j o 2 . a d d H i j o ( n i v e l 3 h i j o 2 ) n i v e l 2 h i j o 2 . a d d H i j o ( n i v e l 3 h i j o 3 ) n i v e l 2 h i j o 4 . a d d H i j o ( n i v e l 3 h i j o 4 ) n i v e l 2 h i j o 4 . a d d H i j o ( n i v e l 3 h i j o 5 ) n i v e l 2 h i j o 5 . a d d H i j o ( n i v e l 3 h i j o 6 ) } }

El cdigo de arriba crea el rbol que hemos visto en la figura superior. Todos estamos de acuerdo en que quiz no es la forma elegante de crear el rbol y probablemente existen formas ms cortas y eficientes de hacerlo. Sin embargo prefiero mantener la claridad en la explicacin para que no se me pierda nadie. Lo siguiente que vamos a hacer es crear las bsquedas en anchura y profundidad. Pero antes de crearlas tendremos que saber qu hace cada una, no?

Bsqueda en anchura
La busqueda en anchura (o bsqueda en amplitud), llamada Breadth First Search en ingls, es un algoritmo usado para recorrer o buscar elementos en una estructura de datos como los rboles y los grafos (aunque nosotros nos centremos ahora mismo en los rboles). Pertenece al grupo de las bsquedas no informadas (sin heursticas). Su procedimiento consiste en ir visitando todos los nodos de un nivel antes de proceder con el siguiente nivel tal y como mostramos en la siguiente figura (los nmeros en naranja indican el orden de exploracin de los nodos):

De modo que lo primero que har ser visitar la raz, luego los hijos de la raz, luego los hijos de cada uno de estos hijos y as sucesivamente. Cmo hacemos esto para que funcione, pensaris? La respuesta es sencilla: usar una cola como estructura de datos auxiliar. Una cola es una estructura FIFO (First In, First Out) en la que slo disponemos de dos operaciones: insertar al final de la cola y extraer del principio de la cola. Por tanto, el elemento que entra el ltimo ser el ltimo en salir. Como hemos elegido Java como lenguaje de programacin para esta entrada, disponemos ya de la interfaz Queue<E> y la clase LinkedList<E> que nos van a brindar la funcionalidad de las colas sin programar nada. Nuestro procedimiento va a ser el siguiente: Insertamos la raz en la cola, como preparacin. Si la cola no est vaca, sacamos el primer elemento (el primer nodo que haya en la cola) y comprobamos si es el elemento que estamos buscando. Si es igual entonces acabamos, si no es igual obtenemos todos los hijos de dicho nodo y los insertamos en la cola (recordamos que las inserciones son por el final). Repetimos hasta que hayamos encontrado el elemento o la cola sea vaca. Finalizamos. Como la bsqueda se realiza desde un NodoArbol (la raz), cabe pensar que la funcin de bsqueda debe ser parte de esta clase. Por tanto, agreamos la siguiente funcin a la clase NodoArbol:
1 p u b l i c b o o l e a n b u s q u e d a A n c h u r a ( c h a r c ) {

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

4/12

30/05/13
2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes


Q u e u e < N o d o A r b o l > c o l a A u x i l i a r = n e w L i n k e d L i s t < N o d o A r b o l > ( ) c o l a A u x i l i a r . a d d ( t h i s ) w h i l e ( c o l a A u x i l i a r . s i z e ( ) ! = 0 ) { N o d o A r b o l c a b e z a = c o l a A u x i l i a r . p o l l ( ) S y s t e m . o u t . p r i n t l n ( c a b e z a . g e t E l e m e n t o ( ) ) / / s o l o a a d i d o c o m o i n f o r m a c i o n p a r a n o s o t r o s i f ( c a b e z a . g e t E l e m e n t o ( ) = = c ) r e t u r n t r u e e l s e f o r ( N o d o A r b o l h i j o : c a b e z a . g e t H i j o s ( ) ) c o l a A u x i l i a r . a d d ( h i j o ) } r e t u r n f a l s e }

Como hemos dicho previamente, lo primero es insertar la raz en la cola para que tengamos algo por donde empezar. A partir de entonces, si existe algo en la cola cogemos la cabecera (la funcin poll() devuelve la cabeza y la elimina de la cola). Ahora comprobamos si el elemento interno de este nodo es el que estamos buscando (recordemos que se debe usar la funcin .equals() para comparar objetos no primitivos). Si el elemento es el que buscamos entonces retornamos de la funcin positivamente, si no lo es entonces cogemos todos los hijos de dicho nodo y los insertamos en la cola para hacer una iteracin ms. Llega el momento de probar que lo que hemos hecho funciona como esperamos. Los siguientes cdigos se deben insertar al final del main de la clase ArbolesBusquedas y lo que obtendramos al ejecutar est marcado como output. Comenzamos probando que encontramos la raz:
1 S y s t e m . o u t . p r i n t l n ( r a i z . b u s q u e d a A n c h u r a ( ' v ' ) ) 2 3 4 5 6 / * o u t p u t v t r u e * /

Comprobamos que encontramos la letra u:


1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 S y s t e m . o u t . p r i n t l n ( r a i z . b u s q u e d a A n c h u r a ( ' u ' ) ) / * o u t p u t v i o r d c n r e e a s c u t r u e * /

Comprobamos que no encontramos la letra z:


1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 S y s t e m . o u t . p r i n t l n ( r a i z . b u s q u e d a A n c h u r a ( ' z ' ) ) / * o u t p u t v i o r d c n r e e a s c u n t

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

5/12

30/05/13
2 0 s 2 1 f a l s e 2 2 * /

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes

Qu pasa si buscamos la letra c? Existen varias letras c, cul encontrar? Probemos:


1 S y s t e m . o u t . p r i n t l n ( r a i z . b u s q u e d a A n c h u r a ( ' c ' ) ) 2 3 4 5 6 7 8 9 1 0 1 1 / * o u t p u t v i o r d c t r u e * /

Entonces, la bsqueda en anchura va a encontrar el elemento de menor profundidad del rbol, si es que existe. Ventajas de la bsqueda en anchura: Es completo: siempre encuentra la solucin si existe. Es ptimo si el coste de cada rama es constante: en Inteligencia Artificial puede que cada nodo sea un estado de un problema, y que unas ramas tengan un coste diferente a las dems. Inconvenientes de la bsqueda en anchura: Complejidad exponencial en espacio y tiempo (incluso peor la del espacio que la del tiempo).

Bsqueda en profundidad
La busqueda en profundidad, llamada Depth First Search en ingls, es un algoritmo usado para recorrer o buscar elementos en un rbol o un grafo y pertenece al grupo de las bsquedas no informadas (sin heursticas). Su procedimiento consiste en visitar todos los nodos de forma ordenada pero no uniforme en un camino concreto, dejando caminos sin visitar en su proceso. Una vez llega al final del camino vuelve atrs hasta que encuentra una bifurcacin que no ha explorado, y repite el proceso hasta acabar el rbol (esto se conoce como backtracking). En la siguiente figura mostramos el orden de visita, siendo los nmeros en naranja dicho orden:

Para poder programar dicho comportamiento vamos a apoyarnos en una estructura de datos llamada pila. Una pila es una estructura de datos LIFO (Last In, First Out) en la que slo disponemos de dos operaciones: apilar y desapilar. Apilar aade el elemento en la cabeza y desapilar lo extrae y elimina. Por tanto, el primer elemento que entre se quedar en el fondo y ser el ltimo en visitarse. Igual que con las colas, Java nos brinda la clase Stack<T> que nos va a servir el comportamiento deseado. Nuestro procedimiento, por tanto, ser: Insertamos la raz en la pila, para preparacin. Mientras haya algo en la pila, desapilamos la cabeza. Comprobamos si es el elemento que buscamos y si lo es acabamos. Si no lo es, cogemos todos los hijos de dicho nodo y los

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

6/12

30/05/13

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes

apilamos todos. Repetimos hasta que encontremos el elemento buscado o la pila est vaca. Finalizamos. Por tanto, aadimos la siguiente funcin a la clase NodoArbol:
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 p u b l i c b o o l e a n b u s q u e d a P r o f u n d i d a d ( c h a r c ) { S t a c k < N o d o A r b o l > p i l a A u x i l i a r = n e w S t a c k < N o d o A r b o l > ( ) p i l a A u x i l i a r . p u s h ( t h i s ) w h i l e ( p i l a A u x i l i a r . s i z e ( ) ! = 0 ) { N o d o A r b o l c a b e z a = p i l a A u x i l i a r . p o p ( ) S y s t e m . o u t . p r i n t l n ( c a b e z a . g e t E l e m e n t o ( ) ) / / s o l o a a d i d o c o m o i n f o r m a c i o n p a r a n o s o t r o s i f ( c a b e z a . g e t E l e m e n t o ( ) = = c ) r e t u r n t r u e e l s e f o r ( i n t i = c a b e z a . g e t H i j o s ( ) . s i z e ( ) 1 i > = 0 i ) p i l a A u x i l i a r . p u s h ( c a b e z a . g e t H i j o s ( ) . g e t ( i ) ) } r e t u r n f a l s e }

Pregunta: por qu no hemos hecho el bucle for igual que en la bsqueda en anchura? Recordemos que una pila es una estructura en la que lo ltimo que entra es lo primero que sale. Nosotros queremos ir explorando el rbol por el camino de ms a la izquieda, tal y como mostrbamos en la figura superior. Si usramos el mismo bucle for que en la bsqueda en anchura, estaramos haciendo la bsqueda por la derecha, puesto que el elemento de la cabeza de la pila siempre sera el hijo de ms a la derecha del nodo consultado. Comprobemos entonces que funciona. Igual que antes, pondremos los siguientes cdigos al final de la creacin del rbol en el main y al ejecutar veremos lo que est marcado como output: Comprobamos que encuentra la raz:
1 S y s t e m . o u t . p r i n t l n ( r a i z . b u s q u e d a P r o f u n d i d a d ( ' v ' ) ) 2 3 4 5 6 / * o u t p u t v t r u e * /

Comprobamos que encuentra la letra u:


1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 S y s t e m . o u t . p r i n t l n ( r a i z . b u s q u e d a P r o f u n d i d a d ( ' u ' ) ) / * o u t p u t v i d a s c o n c u t r u e * /

Comprobamos que no encuentra la letra z:


1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 S y s t e m . o u t . p r i n t l n ( r a i z . b u s q u e d a P r o f u n d i d a d ( ' z ' ) ) / * o u t p u t v i d a s c o n c u r

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

7/12

30/05/13
1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 r e n t e s f a l s e * /

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes

Qu pasa si buscamos la letra c?


1 2 3 4 5 6 7 8 9 1 0 1 1 S y s t e m . o u t . p r i n t l n ( r a i z . b u s q u e d a P r o f u n d i d a d ( ' c ' ) ) / * o u t p u t v i d a s c t r u e * /

Como vemos, la bsqueda en profundidad busca el elemento por el camino de mxima profundidad y cuando ste se acaba, vuelve al ltimo nodo que haba visitado con caminos posibles (caminos abiertos). Ventajas de la bsqueda en profundidad: Es completa si no existen ciclos repetidos. Tiene menor complejidad en espacio que la bsqueda en anchura, porque solo mantenemos en memoria un camino simultneamente. Inconvenientes de la bsqueda en profundidad: No es ptima. Puede no encontrar la solucin aunque exista si hay caminos infinitos. Luego no es completa. Quiz el ejemplo anterior no sea demasiado ilustrativo para el caso de la letra c. Veamos el siguiente rbol, que est simplificado pero nos ayudar a entenderlo mejor:

Ahora veamos qu pasa si buscamos con ambos algoritmos el elemento cuyo carcter es una c. Comenzamos con la bsqueda en anchura:

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

8/12

30/05/13

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes

Ahora la bsqueda en profundidad:

Qu vemos aqu? La bsqueda en anchura ha visitado slo 3 nodos hasta encontrar la solucin mientras que la bsqueda en profundidad ha visitado 11 nodos para encontrar la suya. Significa esto que la bsqueda en anchura es mejor que la bsqueda en profundidad? Miremos un ltimo ejemplo:

Buscamos el elemento cuyo carcter es c y los dos recorridos sern los que se ven en la siguiente figura (click para agrandar):

Y ahora? Cul es mejor? Parece que la bsqueda en profundidad. Concluiremos con que en realidad no hay una bsqueda no informada mejor o peor, porque dependen mucho de la posicin de nuestra solucin dentro del rbol (entendemos solucin por lo que estamos buscando). Cmo solucionamos esto, entonces? La respuesta es usar bsquedas informadas (usando heursticas). Sin embargo es un campo muy amplio y en esta entrada no vamos a tratarlo. Por tanto, podemos generalizar el algoritmo que usaremos en dichas bsquedas como lo

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

9/12

30/05/13

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes

siguiente:
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 l i s t a A b i e r t a < r a i z R E P E T I R S I e s V a c i a ( l i s t a A b i e r t a ) E N T O N C E S D E V O L V E R ( n e g a t i v o ) n o d o < p r i m e r o ( l i s t a A b i e r t a ) S I e s N o d o M e t a ( n o d o ) E N T O N C E S D E V O L V E R ( p o s i t i v o ) l i s t a S u c e s o r e s < e x p a n d i r ( n o d o ) P A R A C A D A n : s u c e s o r e s H A C E R i n s e r t a r ( n , l i s t a A b i e r t a , o r d e n I n s e r c i o n ) F I N

Donde la lista abierta podemos generalizarla como una lista enlazada simple y el orden de insercin es al inicio, al final u otro lugar dependiendo de la bsqueda que estemos haciendo. De esta forma tendramos una forma general de realizarlas. Si esto fuera Ingeligencia Artificial y no una simple bsqueda de un elemento, cabria aadir una instruccin ms por cada sucesor y adems devolver el nodo una vez encontrado, y no un valor booleano.

Algunos usos de las bsquedas


Antes de acabar voy a hablar muy brevemente sobre las aplicaciones de estas bsquedas. La aplicacin bsica es la de encontrar un elemento en concreto dentro de nuestra estructura de datos, como hemos visto. Por su parte, la Inteligencia Artificial trata de, dado un problema, hayar su solucin. Supongamos un laberinto. Nuestro agente inteligente debe encontrar la salida. Si esta bsqueda de la salida la realiza con bsquedas no informadas (sin heursticas) puede acabar en ciclos infinitos (en caso de la bsqueda en profundidad) o tardar muchsimo tiempo (en la bsqueda en anchura siempre encontramos la solucin ms corta si existe, pero esto puede ser en la parte inferior derecha del rbol, que es lo ltimo en visitar). Tambin existen modificaciones de dichos algoritmos como la bsqueda en profundidad limitada (para evitar ciclos infinitos). Para solventar estos problemas surgieron las bsquedas informadas que usan heursticas. stas, antes de explorar un nuevo nodo evaluan cul de los hijos le ofrece mayor recompensa. Esta forma de decidir qu nodo es mejor depende de la heurstica usada, que pueden ser muy variadas e incluso ineficientes. Por ejemplo la heurstica lo que ms me acerque a la meta puede parecer una gran idea. Pero puede traer un inconveniente: y si hay una pared desde donde estoy hasta la meta? S, me queda una casilla para llegar, pero no puedo atravesar el muro! Esto es solamente un ejemplo y hara falta mucha explicacin para cubrir los casos y sobre todo hacer una comparativa en complejidad espacial y temporal de cada una de las bsquedas. Sin embargo como idea inicial de posibles usos de las bsquedas vistas durante la entrada es suficiente. Espero que haya sido de utilidad para los lectores!
Like 12
0

Share

Twittear

11

Esta entrada fue publicada en Programacin y etiquetada como algoritmo, amplitud, anchura, arbol, arbol de busqueda, bfs, breadth first search, busqueda, cola, depth first search, dfs, estructuras de datos, grafos, java, pila, profundidad.

Rogue AP con karmetasploit

Obteniendo informacin de dispositivos Android con Metasploit

4 Respuestas a Bsqueda en anchura y bsqueda en profundidad para rboles

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

10/12

30/05/13

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes

1.

Luismi dijo: 16 septiembre, 2011 at 10:30


Muy bien explicado la verdad, creo que se entiende fcilmente. Por cierto, creo que tienes un error en la numeracin del ejemplo de bsqueda en profundidad (letras n, r, t) Saludos! Responder

meta dijo: 16 septiembre, 2011 at 13:44


Tienes razn, haba una errata en la numeracin de la bsqueda en profundidad. Ya est solucionado! Muchas gracias! Responder

2.

hdfc bank netbanking dijo: 30 marzo, 2012 at 2:51


Keep the religion, my Online companion. You are a first-class author and deserve for being listened to. Responder

3.

kx27 dijo: 29 julio, 2012 at 22:37


muchas gracias, esta muy bien explicado, creo que hasta mejor que mi profe Responder

Deja un comentario
Tu direccin de correo electrnico no ser publicada. Los campos necesarios estn marcados * Nombre * Correo electrnico * Web Comentario

Puedes usar las siguientes etiquetas y atributos HTML:

< ah r e f = " "t i t l e = " " >< a b b rt i t l e = " " >< a c r o n y mt i t l e = " " >< b >

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

11/12

30/05/13

Bsqueda en amplitud y profundidad en rboles | vidasConcurrentes


< b l o c k q u o t ec i t e = " " >< c i t e >< c o d e >< d e ld a t e t i m e = " " >< e m >< i >< q c i t e = " " >< s t r i k e >< s t r o n g >

Escribelasdospalabras

Publicarcomentario

RT @AlbertoHachker: AlbertoHachker Los chicos de @vidasConcurrent se merecen un monumento! Su curso de introduccin para Android es de lo mejorcito! Fu ... hace 256 dias

vidasConcurrentes Sitio creado por meta y sshMan

blog.vidasconcurrentes.com/programacion/busqueda-en-profundidad-y-busqueda-en-anchura/

12/12

You might also like