Programacionavanzada2

Page 128

Rodríguez-Losada & San Segundo, 2009. Programación Avanzada, Concurrente y Distribuida

128

clave[depth]=-1; for(int j=0; j<TAM_NUMEROS; j++) { clave[depth]+=1; FuncRec(depth+1); }

El procedimiento es completo y para ello basta con analizar la forma del árbol de búsqueda. El árbol tiene 6 niveles de profundidad y en cada nivel, todos los nodos tienen exactamente 10 hijos (lo que se conoce como factor de ramificación del árbol), por lo que en el último nivel hay exactamente 106 nodos hoja que son el número de claves posibles a generar.

7.5.2.1.1 Comparativa entre ambos algoritmos Desde la perspectiva de la complejidad computacional, el algoritmo iterativo es más eficiente en tiempo ya que el algoritmo recursivo tiene que generar no solamente los nodos hoja sino el resto del árbol. El número de nodos totales N de un árbol uniforme con factor de ramificación b y profundidad d es: N = 1 + b + b 2 + b3 + L + b d −1 + b d

En el ejemplo b=10 y d = 6 con 106 hojas y 1+10+100+1000+10000+100000 =111.111 nodos adicionales hasta completar la totalidad del árbol (aproximadamente un 11%). Además los compiladores modernos consiguen buenas optimizaciones de iteraciones pero no de recurrencias. En la parte positiva del código recursivo cabe destacar: •

Es más compacto: El número de sentencias que necesita es claramente más corto y además no depende del tamaño de la clave. Lamentablemente no se puede decir lo mismo de la legibilidad.

Es parametrizable completamente: El algoritmo iterativo permite definir un parámetro TAM_NUMEROS configurable pero no permite definir el parámetro TAM_CLAVE. Esto quiere decir que habrá que añadir tantas sentencias for como números tenga la clave, lo que no ocurre en la versión recursiva.

En cuanto a los requisitos en espacio, ambas implementaciones presentan un buen comportamiento. En el caso de la versión recursiva solamente se emplea la pila de llamadas para pasar el parámetro profundidad que es la única información que se requiere para construir los nodos sucesores. Los diferentes estados se generan ‘al vuelo’ actualizando una única variable global clave. En este ejemplo la versión iterativa es más intuitiva porque el problema de desciframiento de claves se presta a ello. Sin embargo, existen muchos otros problemas donde no es fácil, ni mucho menos intuitivo, implementar el control de las iteraciones para conseguir la solución. Para estos problemas y debido al buen comportamiento de la búsqueda primero en profundidad en cuanto al consumo de memoria, el uso de recursión es preferible. Los algoritmos más eficientes para muchos problemas NP-Duros (como por ejemplo el problema del Máximo Clique) se implementan mediante esta técnica.

Universidad Politécnica de Madrid -UPM


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.