Класс словаря PHP? или альтернатива?

В основном то, что я ищу, является некоторым классом или методом для реализации словаря в PHP. Например, если я создавал нескремблер слова - позволяет, говорят, что я использовал буквы 'a, e, l, p, p'. Количество возможностей для расположения огромно - как я только отображаю тех, которые являются фактическими словами (яблоко, бледное и т.д.)?

Спасибо!

5
задан Rohan 9 February 2010 в 12:46
поделиться

5 ответов

Классические задачи поиска слов могут быть эффективно решены с использованием Trie .

Я бы посоветовал найти список слов, скажем, из WordNet , сохранить его в Trie, а затем выполнить быстрый поиск возможных слов.

Решение будет иметь следующий вид:

  1. загрузить список слов
  2. сохранить список слов в дереве
  3. принять ввод для слова для расшифровки
  4. попробовать перестановки i = 1..N

    ​​а. поиск перестановки i с использованием дерева

    b. если есть положительный результат, сохраните его для отображения

    c. iterate (i ++)

  5. repeat from 3.

edit:

Замечание: для любого символьного слова длиной N может быть N! требуемый поиск (для 7 символов это будет 5040). Вам следует подумать об оптимизации алгоритма поиска в дереве. Например, вы получаете существенную эффективность, исключая недопустимые подстроки на раннем этапе и не повторяя перестановки концов.

например. учитывая слово «яблоко», если у вас была перестановка, в которой вы выбрали «ppl» в качестве первых трех символов, слово не будет найдено. Итак, как бы вы ни переставляли a и e в конце, вы не можете составить слово. Раннее прекращение перестановок может быть важным для эффективности вашего алгоритма.

3
ответ дан 14 December 2019 в 04:37
поделиться

А, и еще один ответ:

Если вы просто хотите получить все настоящие слова - найдите любой большой словарь. затем сохраните его в виде:

слово | hash

, где слово - это само слово, а хеш отсортирован по алфавиту:

для яблока хеш будет: aelpp или aelp2

, затем для заданных букв просмотрите все комбинации, используя тот же алгоритм для хеширования, и выполните поиск по этой таблице.

3
ответ дан 14 December 2019 в 04:37
поделиться

, вы также можете рассмотреть pspell

http://php.net/manual/en/book.pspell. php

$ps = pspell_new("en");
foreach(array('alppe', 'plape', 'apple') as $word)
   if(pspell_check($ps, $word))
      echo $word;
2
ответ дан 14 December 2019 в 04:37
поделиться

Храните список слов в файле или базе данных, а затем просто попробуйте все комбинации. Вы также можете рассмотреть вероятное положение гласных и согласных для потенциального ускорения. Вместо того, чтобы составлять свой собственный список слов, вы можете использовать что-то вроде WordNet.

0
ответ дан 14 December 2019 в 04:37
поделиться

На самом деле мне больше нравится решение zerkms, но вот еще одно

создать 2 таблицы

words
-----
word_id (primary key)
word


letter_index
-----
letter (idx)
word_id (idx)

Когда вы добавляете слово в таблицу слов, вам нужно добавить запись в letter_index за каждую уникальную букву. letter_index имеет первичный ключ, основанный как на letter, так и на word_id.
Чтобы найти слова, состоящие из группы букв, вы создаете запрос вроде:

SELECT word FROM words w
// for each letter in the search
INNER JOIN letter_index i ON ( w.word_id = i.word_id AND i.letter = letter_1 )
INNER JOIN letter_index i ON ( w.word_id = i.word_id AND i.letter = letter_2 )
INNER JOIN letter_index i ON ( w.word_id = i.word_id AND i.letter = letter_3 )
...
INNER JOIN letter_index i ON ( w.word_id = i.word_id AND i.letter = letter_n )
0
ответ дан 14 December 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: