Я ищу короткий, простой алгоритм создания/использования суффиксного дерева в Java. Лучшее, которое я нашел до сих пор, находится скручивание жгутов Семантический Инструментарий Исследования, но реализация является несколькими тысячами строк долго и охватывает несколько классов. Идеально, реализация была бы максимально коротка и охватила бы не больше, чем несколько сотен строк.
У кого-либо есть такая реализация?
[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». должен найти вам это.