Si el objetivo es encontrar el "el mayor descanso posible para la entrada" a medida que respondió, entonces el algoritmo podría ser bastante sencillo si usas alguna teoría de grafos Tomas la palabra compuesta y haces un gráfico con un vértice antes y después de cada letra. Tendrás un vértice para cada índice en la cadena y uno más allá del final. A continuación, encontrará todas las palabras legales en su diccionario que son subcadenas de la palabra compuesta. Luego, para cada subcadena legal, agregue un borde con un peso 1 al gráfico que conecta el vértice antes de la primera letra en la subcadena con el vértice después de la última letra en la subcadena. Finalmente, use un algoritmo de ruta más corta para encontrar la ruta con menos bordes entre el primer y el último vértice.
El pseudo código es algo como esto:
parseWords(compoundWord)
# Make the graph
graph = makeGraph()
N = compoundWord.length
for index = 0 to N
graph.addVertex(i)
# Add the edges for each word
for index = 0 to N - 1
for length = 1 to min(N - index, MAX_WORD_LENGTH)
potentialWord = compoundWord.substr(index, length)
if dictionary.isElement(potentialWord)
graph.addEdge(index, index + length, 1)
# Now find a list of edges which define the shortest path
edges = graph.shortestPath(0, N)
# Change these edges back into words.
result = makeList()
for e in edges
result.add(compoundWord.substr(e.start, e.stop - e.start + 1))
return result
que, obviamente, no he probado este pseudo-código, y puede haber algunos errores off-by-one de indexación, y no hay cualquier error de comprobación, pero la idea básica está ahí. Hice algo similar a esto en la escuela y funcionó bastante bien. Los bucles de creación de borde son O (M * N), donde N es la longitud de la palabra compuesta, y M es la longitud máxima de palabra en su diccionario o N (el que sea menor). El tiempo de ejecución del algoritmo de ruta más corta dependerá del algoritmo que elija. Dijkstra's viene más a la mente. Creo que su tiempo de ejecución es O (N^2 * log (N)), ya que los bordes máximos posibles son N^2.
Puede usar cualquier algoritmo de ruta más corta. Hay several shortest path algorithms que tienen sus diversas fortalezas y debilidades, pero supongo que para su caso la diferencia no será muy significativa. Si, en lugar de tratar de encontrar la menor cantidad posible de palabras para dividir el compuesto, quisieras encontrar el más posible, entonces le das a los bordes pesas negativas y tratas de encontrar el camino más corto con an algorithm that allows negative weights.
¿Necesita obtener todos los análisis posibles, o solo uno? Por ejemplo, "anatomía" puede ser solo una palabra: anatomía, o puede ser: an, at, o, my. ¿Necesita todos los posibles desgloses? –
Necesitamos la mayor separación posible para la entrada – Manas
ha, buena suerte amigo ... – Jason