Короткий, реализация Java суффиксного дерева и использование?

Я ищу короткий, простой алгоритм создания/использования суффиксного дерева в Java. Лучшее, которое я нашел до сих пор, находится скручивание жгутов Семантический Инструментарий Исследования, но реализация является несколькими тысячами строк долго и охватывает несколько классов. Идеально, реализация была бы максимально коротка и охватила бы не больше, чем несколько сотен строк.

У кого-либо есть такая реализация?

8
задан Stefan Kendall 11 January 2010 в 15:39
поделиться

1 ответ

[MS-NRBF]: .NET Удаленное взаимодействие: структура данных в двоичном формате

-121--2557683-

Имеются 2 проблемы.

Во-первых, компилятор не будет преобразовывать pass-by-ref в pass-by-value, особенно если complexComputation не является статическим (т.е. может использоваться внешними объектами).

Причиной является совместимость API. Для ЦП нет такого понятия, как «ссылка». Компилятор будет преобразовывать ссылки на указатели. Параметры передаются в стеке или через регистр, поэтому код, вызывающий complexComputation , скорее всего, будет вызван как (предположим, double имеет длину 4 на мгновение):

str x1, [r7, #0x20]
str y1, [r7, #0x24]
str x2, [r7, #0x50]
str y2, [r7, #0x54]
push r7, #0x20     ; push address of p1 onto the stack
push r7, #0x50     ; push address of p2 onto the stack
call complexComputation

В стек вставляются только 8 байт.

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

push x1    ; push a copy of p1.x onto the stack
push y1    ; push a copy of p1.y onto the stack
push x2    ; push a copy of p2.x onto the stack
push y2    ; push a copy of p2.y onto the stack
call complexComputation

Обратите внимание, что на этот раз 16 байтов в стек, а содержимое - это числа, а не указатели. Если complexComputation изменит свой параметр, передающий семантику, входные данные превратятся в мусор, и программа может потерпеть сбой.


С другой стороны, оптимизация

double complexComputation(const Point& p1, const Point& p2) {
    double x1 = p1.x; double x2 = p2.x;
    double y1 = p1.y; double y2 = p2.y;
    // x1, x2, y1, y2 stored in registers and used frequently in computations
}

может быть легко выполнена, поскольку компилятор может распознавать, какие переменные используются очень часто и сохранить их в зарезервированных регистрах (например, r4 _ r13 в архитектуре ARM и многие из регистров sXX/dXX) для более быстрого доступа.


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

-121--1396155-

Статья «Построение массива простых линейных рабочих суффиксов» Карккайнена и Сандерса заканчивается 50 строками C++. Вероятно, вам также понадобится что-то для создания массива LCP. Гуглинг для «Вычисления массива LCP за линейное время, учитывая S и суффикс массива POS». должен найти вам это.

1
ответ дан 5 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

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