Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

156
Visualizações
¿Cómo puedo buscar eficientemente una cadena de ocurrencias de palabras?

Esencialmente, tengo un Conjunto de palabras, alrededor de 250,000 de ellas y quiero poder devolver una lista de las que se encuentran en una cadena determinada.

p.ej. la cadena de entrada es 'APPLEASEDITION', quiero regresar

 [APP,APPLE,PLEA, PLEAS,PLEASE,PLEASED,lEA,LEAS,LEASE,LEASED,EA,EAS,EASE,EASED,AS,SEDITION,EDITION,IT,TI,ON]

Se me ocurrió este código, que funciona más rápido que el método mencionado anteriormente para cadenas de entrada más cortas (hasta 15 caracteres), pero duplica el tiempo de ejecución con cada letra agregada:

 const findWords = (instring, solutions = null) => { if (!solutions) solutions = new Set(); if (!instring) { return new Set(); } if (words[instring]) { solutions.add(instring); } const suffix = instring.slice(1); const prefix = instring.slice(0, instring.length - 1); if (!solutions.has(prefix)) solutions = new Set([...solutions, ...findWords(prefix, solutions)]); if (!solutions.has(suffix)) solutions = new Set([...solutions, ...findWords(suffix, solutions)]); return solutions; };

¿Me pregunto si alguien puede ayudarme a optimizar el código?

Editar:

Hice una solución diferente, funciona mucho mejor.

 const getAllSubstrings = (str) => { let result = []; for (let i = 0; i < str.length; i++) { for (let j = i + 1; j < str.length + 1; j++) { result.push(str.slice(i, j)); } } return result; } const findWords = (instring) => { const solutions = [] let subs = getAllSubstrings(instring) for (let sub of subs) { if (words[sub]) solutions.push(sub) } return solutions }

Todavía abierto a posibles mejoras, pero esto funciona lo suficientemente bien para mi caso de uso

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

  1. Tal como está, su lógica asume que su entrada comienza o termina con la frase, pero no considera las palabras en el medio; deberá generar permutaciones

  2. Convierta su diccionario en un hash donde las palabras son claves - O(n) => O(1) - puede comprobar si hay palabras posibles en el diccionario comprobando dictionary[possibleWord]

  3. Puede convertir su matriz de palabras del diccionario en un árbol de búsqueda binaria o un trie: puede haber un beneficio de rendimiento al convertir su texto fuente en una colección de BST/Tries, donde cada uno representa una posible palabra/permutación, y luego comparar BST /Intenta en lugar de cadenas, pero no estoy seguro de cómo eso sería más rápido que la comparación de cadenas en este momento.

Puede limitar la longitud a la longitud máxima de una permutación determinada de las palabras de su diccionario. Terminará con muchas permutaciones, pero posiblemente menos de las que tiene actualmente.

Como indican los comentarios, es posible que desee hacer este lado del servidor para obtener más potencia/en un lenguaje más eficiente que JS, o usar WASM.

Algunas bibliotecas de JavaScript que tienen herramientas de árbol de búsqueda binario:

  • https://developers.google.com/closure/library/
  • https://www.npmjs.com/package/binary-search-tree
  • https://www.npmjs.com/package/trie-search
  1. Alternativamente, puede crear dos valores hash (uno de permutaciones, uno de palabras de diccionario) u otra estructura de datos creada para crear una "diferencia" o "superposición", y extraer las claves que están en ambos conjuntos.
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda