¿Cuál es la complejidad temporal de resolver de manera recursiva el problema del salto de palabra?

Describiré cómo me gusta pensar en preguntas como esta.

La recursión se puede visualizar como atravesar un árbol, donde cada nodo representa una cierta forma de romper un prefijo de la cadena, y sus hijos directos representan las posibilidades para el siguiente salto de palabra. (¡Dibuje un árbol así! Intente ver cómo el algoritmo atraviesa todas sus ramas).

Cada borde del árbol representa una subcadena de la cadena de entrada. Para cada carácter, se realiza una búsqueda en el diccionario.

Entonces, el número total de búsquedas de diccionario es la suma de las longitudes de los bordes en el árbol .

Ahora, esto es difícil de expresar en términos de cantidades simples como la longitud de la cuerda, pero podemos simplificar sobrestimando la suma de las longitudes de los bordes por la suma de las longitudes de todos los caminos desde la raíz hasta la hoja. (Por lo tanto, estamos tratando de obtener un límite superior ahora). Ahora las cosas se vuelven más fáciles porque cada ruta tiene una longitud n (la longitud de la cadena), y el número de hojas es igual al número de soluciones s.

Entonces, el número de búsquedas de diccionario es como máximo n * s. ¡Hurra!

Finalmente, la implementación del diccionario en el sitio web vinculado es muy pobre, se repite en cada palabra del diccionario. Sea d el tamaño del diccionario, entonces esto cuesta otro factor d.

Por lo tanto, el tiempo total de cálculo es como máximo n * s * d búsquedas de diccionario de una sola palabra. Esto no es muy bueno: se podría evitar fácilmente recorrer todo el diccionario. Además, se podría guardar una gran cantidad de trabajo si se unen los nodos del árbol que representan el mismo prefijo, de modo que sus descendientes deben procesarse solo una vez. (Eso se llama programación dinámica).

More Interesting

¿Por qué prácticamente todos los algoritmos de ascensor son tan ineficientes y cuáles son las razones por las que aún no se han optimizado?

¿Qué tipo de clasificación es esta?

¿Cuáles son los mejores libros sobre algoritmos y estructuras de datos?

¿Cuál es la diferencia entre [matemáticas] 2 ^ {n ^ {o (1)}} [/ matemáticas] y [matemáticas] 2 ^ {O (n ^ e)} [/ matemáticas] (para algunos e <1)?

¿Qué estoy haciendo mal al determinar el big-O de estas funciones Java?

Cómo convertir una cadena en una matriz de caracteres

¿Para qué aplicaciones son especialmente adecuados los lenguajes de programación lógica? ¿Cuándo usarías un lenguaje como Prolog? ¿Cuáles son las aplicaciones más exitosas de la programación lógica?

La inmutabilidad es primordial en la mayoría de los dominios de FP, pero ¿hacen copias superficiales o profundas?

Cómo ordenar matrices en C

Dada una biblioteca que proporciona una coincidencia aproximada de cadenas, ¿cuáles son algunos procedimientos adicionales que pueden explicar una mejor coincidencia de cadenas?

Cómo hacer que un algoritmo se visualice como visualgo.net

Estoy buscando algunas clases que me darían consejos sobre el enfoque. ¿Debo tomar el diseño del sistema, el algoritmo o la preparación de la estructura de datos?

¿Qué estrategias o algoritmos se utilizan para agrupar rutas de pasajeros en función de la ubicación y la hora de salida?

¿Es mejor aprender estructuras de datos y algoritmos en C ++ o Java?

¿Qué es la búsqueda de fuerza bruta?