Изменения

Об ускорении поиска повторов ОСАМ-методом

309 байтов добавлено, 21:27, 17 ноября 2011
м
K-D-N дерево
* Нелистовые узлы содержат полное разбиение набора данных на диапазоны по одному из измерений, плюс вычисленные на этапе построения дерева минимальное и максимальное значение выбранного измерения у всех попавших в узел элементов. Размеры всех диапазонов одинаковы и равны половине размера ожидаемой окрестности, по которой будет производиться поиск. Больше хуже — массив данных очень плотный, и разделение пространства становится неэффективным. Меньше тоже хуже — сильно возрастает количество узлов дерева, которые нужно просматривать при поиске.
* Если полный диапазон по какому-то измерению меньше, чем 1.5 * размер ожидаемой при запросе окрестности поиска, разбиение по этому измерению не производится, потому что оно всё равно будет неэффективно — при поиске почти наверняка придётся заглядывать во все дочерние узлы. Почему 1.5? Потому что это 3*ε, если ищем по окрестности (c-ε ≤ x ≤ c+ε). В этом случае пространство разделится на 3 «полосы» каждая размером по ε, запрашиваемый центр окрестности почти наверняка попадёт в центральную из этих полос (помним, что распределение у нас почти нормальное), соответственно, искомые элементы почти наверняка смогут оказаться в любой из трёх полос.
* Листовые узлы содержат наборы элементов. Технически — списки индексов элементов в изначальном массиве данных. Сами элементы хранить смысла нет, так как нам всё равно нужны индексы, чтобы сопоставлять элементы положениям в ДНК-последовательности.
* Дополнительно создаются вариационные ряды (списки индексов элементов), упорядоченные по каждой координате.
* При поиске просто спускаемся по дереву, просматривая узлы, в которых могут содержаться подходящие элементы, и всё время запоминаем максимальное и минимальное значение по каждому измерению. Так как индексируемый набор данных известен полностью, запоминаются они в виде номера элемента в вариационном ряде.