Estoy buscando un algoritmo eficiente para codificar un conjunto de letras en una permutación que contiene el número máximo de palabras.Algoritmo eficiente de codificación de palabras
Por ejemplo, digamos que me da la lista de letras: {e, e, h, r, s, t}. Necesito ordenarlos de tal manera que contengan la cantidad máxima de palabras. Si ordeno esas letras en "theres", contienen las palabras "the", "there", "her", "here", y "ere". Entonces ese ejemplo podría tener una puntuación de 5, ya que contiene 5 palabras. Quiero ordenar las letras de tal manera que tenga el puntaje más alto (contiene la mayoría de las palabras).
Un algoritmo ingenuo sería intentar y puntuar cada permutación. Creo que esto es O (n!), Por lo que se probarán 720 permutaciones diferentes solo para las 6 letras anteriores (incluidos algunos duplicados, ya que el ejemplo tiene e dos veces). Para más letras, la solución ingenua se vuelve rápidamente imposible, por supuesto.
El algoritmo no tiene que producir realmente la mejor solución, pero debería encontrar una buena solución en un tiempo razonable. Para mi aplicación, simplemente adivinar (Monte Carlo) a unos pocos millones de permutaciones funciona bastante mal, por lo que actualmente es la marca a vencer.
Actualmente estoy usando el algoritmo Aho-Corasick para anotar permutaciones. Busca cada palabra en el diccionario en una sola pasada a través del texto, por lo que creo que es bastante eficiente. Esto también significa que tengo todas las palabras almacenadas en un trie, pero si otro algoritmo requiere un almacenamiento diferente, eso también está bien. No estoy preocupado por configurar el diccionario, solo el tiempo de ejecución del pedido y la búsqueda real. Incluso un diccionario difuso podría usarse si fuera necesario, como un Bloom Filter.
Para mi aplicación, la lista de letras dada es de aproximadamente 100 y el diccionario contiene más de 100.000 entradas. El diccionario nunca cambia, pero se deben ordenar varias listas de letras diferentes.
Estoy pensando en probar path finding algorithm. Creo que podría comenzar con una carta al azar de la lista como punto de partida. Entonces, cada letra restante se usaría para crear un "camino". Creo que esto funcionaría bien con el algoritmo de puntuación Aho-Corasick, ya que los puntajes se pueden construir una letra a la vez. Aunque aún no he intentado encontrar ruta; tal vez ni siquiera es una buena idea? No sé qué algoritmo de búsqueda de ruta podría ser el mejor.
Otro algoritmo en el que pensé también comienza con una letra al azar. Luego se buscará en el diccionario trie las ramas "ricas" que contengan las letras restantes. Las ramas de diccionario que contienen letras no disponibles se eliminarán. Estoy un poco confuso sobre los detalles de cómo funcionaría esto exactamente, pero podría eliminar por completo las permutaciones de puntuación.
¡Gran pregunta, bien hecha! – erickson
Ere es una palabra. Eso hace que el puntaje de tu ejemplo original sea 5. –
Parece que es NP-algo, lol. –