Поиск:

Ответ в темуСоздание новой темы Создание опроса
> индексация триплетов, подскажите метод 
:(
    Опции темы
whiteman
Дата 12.4.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



Друзья, 

недавно начал осваивать лисп и мне нужен совет

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

спасибо.
PM MAIL   Вверх
adejneka
Дата 13.4.2009, 05:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 8.7.2005
Где: Москва, Россия

Репутация: 9
Всего: 11



Для какого языка всё делается и какова доля "проидексированных" триплетов? Нужно ли знать, входит ли триплет в набор, или нужно запоминать еще дополнительную информацию?

Если для русского языка, регистр значения не имеет, то всего триплетов (* 33 33 33)=>35937, т.е. запоминать нужно почти каждый второй из возможных. Если нужен определять только наличие, то я бы просто сделал битовый вектор, в котором каждому триплету соответствует позиция (((номер первой буквы)*33+(номер второй буквы))*33+(номер третьей буквы)) (всего 4,5 К). Если нужна дополнительная информация - вектор, но не битовый (144 К на 32-битной машине + объём дополнительной информации).

Если множество триплетов разреженное, то можно использовать хэш-таблицу или
Код

(defstruct dictionary
  (letters "" :type string)
  (values #() :type vector #| of dictionary on levels 1, 2 / of additional info|#))

Тогда словарь ("abc" -> X, "abd" -> Y, "acf" -> Z) можно представить как
Код

#S(DICTIONARY :LETTERS "a"
              :VALUES #(#S(DICTIONARY :LETTERS "bc"
                                      :VALUES #(#S(DICTIONARY :LETTERS "cd" :VALUES #(X Y))
                                                #S(DICTIONARY :LETTERS "f" :VALUES #(Z))))))


PM MAIL   Вверх
whiteman
Дата 13.4.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



adejneka, 

большое спасибо за ответ.

Пытаюсь понять приведенный вами код, надеюсь книжки мне ближе к вечеру помогут разобраться.  smile 

Я стараюсь написать простой спелчекер, один из способов выявление ошибки - поиск не встречающихся в  большом объеме текста триплетов.

Множество триплетов разреженное,  язык русский, регистр значения не имеет. 
PM MAIL   Вверх
whiteman
Дата 13.4.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



а может имеет смысл триплеты перевести в символы и работать с символами?

PM MAIL   Вверх
whiteman
Дата 13.4.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



Друзья, я последовал совету adejneka и нашел, как мне кажется, пригодное решение.

привожу его код под двум причинам:
1) может кто-то покритикует.
2) может кому-то пригодится.

Код

(defvar *triplets-table* (make-hash-table :test 'equal :size 40000))

(defun add-triplet (atriplet)
  (setf (gethash atriplet *triplets-table*)    T )
)

(defun get-triplet (atriplet)
  (gethash atriplet *triplets-table*)
)

(defun split-3(astring)
"splits input into triplets"
(let (
       (result '())
       (tmpStr)
     )

   (dotimes (i (- (length astring) 2))
     (setq tmpStr (subseq astring i (+ i 3)))
     (if (NOT (search " " tmpStr))
         (progn
           (setq result  (cons tmpStr result ))
           (add-triplet tmpStr)
         )
     )
   )
   result
)
)


Это сообщение отредактировал(а) whiteman - 13.4.2009, 21:26
PM MAIL   Вверх
adejneka
Дата 13.4.2009, 21:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 8.7.2005
Где: Москва, Россия

Репутация: 9
Всего: 11



Код

(defun split-3 (astring)
  "splits input into triplets"
  (let ((result '()))
    (dotimes (i (- (length astring) 2))
      (let ((tmpStr (subseq astring i (+ i 3))))
        (unless (find #\Space tmpStr)
          (push tmpStr result)
          (add-triplet tmpStr))))
    result))

Можно было еще соптимизировать: поменять местами SUBSEQ и UNLESS-FIND, за счёт чего устраняется создание строки с пробелом:
Код

      (unless (find #\Space astring :start i :end (+ i 3))
        (let ((tmpStr (subseq astring i (+ i 3))))
          (push tmpStr result)
          (add-triplet tmpStr)))

но вряд ли эффект будет заметен.
PM MAIL   Вверх
whiteman
Дата 14.4.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.4.2009

Репутация: нет
Всего: нет



adejneka, большое спасибо за помощь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.3770 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.