![]() |
|
|
![]()
|
|
| whiteman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.4.2009 Репутация: нет Всего: нет |
Друзья,
недавно начал осваивать лисп и мне нужен совет как лучше проиндексировать около 20 000 уникальных триплетов букв типа "абв" "гдф" так, чтобы потом иметь возможность проверить есть ла данная комбинация, к слову "хзх", в проиндексированной структуре данных. спасибо. |
|||
|
||||
| adejneka |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 8.7.2005 Где: Москва, Россия Репутация: 9 Всего: 11 |
Для какого языка всё делается и какова доля "проидексированных" триплетов? Нужно ли знать, входит ли триплет в набор, или нужно запоминать еще дополнительную информацию?
Если для русского языка, регистр значения не имеет, то всего триплетов (* 33 33 33)=>35937, т.е. запоминать нужно почти каждый второй из возможных. Если нужен определять только наличие, то я бы просто сделал битовый вектор, в котором каждому триплету соответствует позиция (((номер первой буквы)*33+(номер второй буквы))*33+(номер третьей буквы)) (всего 4,5 К). Если нужна дополнительная информация - вектор, но не битовый (144 К на 32-битной машине + объём дополнительной информации). Если множество триплетов разреженное, то можно использовать хэш-таблицу или
Тогда словарь ("abc" -> X, "abd" -> Y, "acf" -> Z) можно представить как
|
||||
|
|||||
| whiteman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.4.2009 Репутация: нет Всего: нет |
adejneka,
большое спасибо за ответ. Пытаюсь понять приведенный вами код, надеюсь книжки мне ближе к вечеру помогут разобраться. Я стараюсь написать простой спелчекер, один из способов выявление ошибки - поиск не встречающихся в большом объеме текста триплетов. Множество триплетов разреженное, язык русский, регистр значения не имеет. |
|||
|
||||
| whiteman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.4.2009 Репутация: нет Всего: нет |
а может имеет смысл триплеты перевести в символы и работать с символами?
|
|||
|
||||
| whiteman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.4.2009 Репутация: нет Всего: нет |
Друзья, я последовал совету adejneka и нашел, как мне кажется, пригодное решение.
привожу его код под двум причинам: 1) может кто-то покритикует. 2) может кому-то пригодится.
Это сообщение отредактировал(а) whiteman - 13.4.2009, 21:26 |
|||
|
||||
| adejneka |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 8.7.2005 Где: Москва, Россия Репутация: 9 Всего: 11 |
Можно было еще соптимизировать: поменять местами SUBSEQ и UNLESS-FIND, за счёт чего устраняется создание строки с пробелом:
но вряд ли эффект будет заметен. |
||||
|
|||||
| whiteman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 12.4.2009 Репутация: нет Всего: нет |
adejneka, большое спасибо за помощь.
|
|||
|
||||
![]()
|
| Правила форума LISP | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | LISP | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |