Как создать обратный индекс для полнотекстового поиска в языке Common LISP?

Многомерные массивы в C на самом деле являются массивами массивов. (Это не может быть любым другим способом, так как RAM по своей природе линейна). Вы можете эмулировать их для линейных массивов в терминах арифметики указателей:

#undef NDEBUG
#include <assert.h>
#include <stdint.h>
int main()
{
    typedef uint32_t TYPE;
    enum{A=3,B=4,C=5};
    TYPE a[A][B][C];

    assert((char*)&a[1][2][3] == ((char*)&a) + \
          3*sizeof(TYPE) + 2 *C*sizeof(TYPE) + 1 *B*C*sizeof(TYPE));
}

Компьютеры не позволяют вам обращаться к типам под-символов, но нетрудно представить тип под-символов.

Вышеуказанное вычисление смещения символа для адресации [1] [2] [3] можно переписать как

char_ix = (3*sizeof(TYPE)*CHAR_BIT + 2 *C*sizeof(TYPE)*CHAR_BIT + 1 *B*C*sizeof(TYPE)*CHAR_BIT)/CHAR_BIT;

, и если вместо символов (8 бит) вы хотите обратиться, например, 4 -бит, вы бы изменили его на

char_ix_of_4_bit = 
     (3*sizeof(TYPE)*CHAR_BIT/2 + 
      2 *C*sizeof(TYPE)*CHAR_BIT/2 + 
      1 *B*C*sizeof(TYPE)*CHAR_BIT/2) \
     / CHAR_BIT; //2 4-bits per octet

char_ix_of_4_bit_remainder = 
     (3*sizeof(TYPE)*CHAR_BIT/2 + 
      2 *C*sizeof(TYPE)*CHAR_BIT/2 + 
      1 *B*C*sizeof(TYPE)*CHAR_BIT/2) \
     % CHAR_BIT; //2 4-bits per octet

4-битное значение в месте назначения будет тогда

((unsigned char*)&a)[char_ix_of_4_bit] >> (4*char_ix_of_4_bit_remainder)

аналогично для других битовых групп.

Короче говоря, вы можете думать о многомерных битовых массивах, заново представлять их как линейные битовые массивы, а затем использовать регулярное индексирование и сдвиг битов для адресации соответствующей битовой группы или отдельных битов (IIRC, C ++ std::bitset / std::vector<bool> скрывают последняя часть посвящена индексации битов с помощью перегруженного оператора [], но это не сложно сделать вручную (это то, что вам нужно делать в чистом C, так как в чистом C нет перегрузки операторов).

[ 1113] Говорят, что битовые операции медленнее и генерируют больший код, чем операции с целыми типами, но это вполне может быть компенсировано лучшей локализацией кэша, которая при использовании битовых массивов подстроковых символов может купить вас в зависимости от ваших данных (лучше у вас есть много данных, если вы пытаетесь это сделать).

6
задан pupeno 20 May 2009 в 05:23
поделиться

2 ответа

montezuma является тем же самым как lucene, но записанный в шепелявости.

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

9
ответ дан 10 December 2019 в 00:46
поделиться

Я знаю, что Вы спрашиваете о языке Common LISP, но существуют ориентированные приложения поискового сервиса многого инвертированного текста. Одним известным и уважаемым на является Lucene.

Решение могло состоять в том, чтобы использовать ту поисковую систему, но соединить интерфейсом с Вашим кодом языка Common LISP через веб-сервис API? (xml-rpc, xml по http или просто тексту по http)?

Существует ли дальнейшая причина, почему Вы хотели бы, чтобы она была в языке Common LISP? Пакеты как Lucene могут покрыть все связанные с поиском функции, в которых Вы нуждаетесь, в то время как использование удаленного API может все еще позволить Вам выполнять свою более сложную логику в языке Common LISP.

1
ответ дан 10 December 2019 в 00:46
поделиться