Дерево приоритетного поиска - Priority search tree

В Информатика, а дерево приоритетного поиска представляет собой древовидную структуру данных для хранения точек в двух измерениях. Первоначально он был представлен Эдвард МакКрайт.[1] По сути, это расширение приоритетная очередь с целью улучшения времени поиска с O (п) тоже(s + журнал п) время, где п это количество точек в дереве и s количество баллов, возвращенных поиском.

Описание

Дерево приоритетного поиска используется для хранения набора двумерных точек, упорядоченных по приоритету и значению ключа. Это достигается путем создания гибрида приоритетная очередь и двоичное дерево поиска.

Результатом является дерево, в котором каждый узел представляет точку в исходном наборе данных. Точка, содержащаяся в узле, имеет самый низкий приоритет. Кроме того, каждый узел также содержит значение ключа, используемое для разделения оставшихся точек (обычно медиана ключей, исключая точку узла) на левое и правое поддерево. Точки разделяются путем сравнения их значений ключей с ключом узла, делегируя те, у которых ключи более низкие, левому поддереву, а те, которые строго больше, - правому поддереву.[2]

Операции

Строительство

Для построения дерева требуется O (п бревно п) время и O (п) Космос. Ниже предлагается алгоритм построения:

дерево construct_tree(данные) {  если длина(данные) > 1 {      точка_узла = find_point_with_minimum_priority(данные) // Выбираем точку с самым низким приоритетом        уменьшенные_данные = remove_point_from_data(данные, точка_узла)    node_key = Calcul_median(уменьшенные_данные) // вычисляем медиану, исключая выбранную точку        // Делим точки     left_data = []    right_data = []           за (точка в уменьшенные_данные) {      если точка.ключ <= node_key         left_data.добавить(точка)      еще         right_data.добавить(точка)    }    left_subtree = construct_tree(left_data)    right_subtree = construct_tree(right_data)    возвращаться узел // Узел, содержащий node_key, node_point и левое и правое поддеревья  } еще если длина(данные) == 1 {     возвращаться лист узел // Конечный узел, содержащий единственную оставшуюся точку данных  } еще если длина(данные) == 0 {    возвращаться ноль // Этот узел пуст  }}

Поиск заземленного диапазона

В дереве поиска приоритета можно эффективно запрашивать ключ в закрытом интервале и максимальное значение приоритета. То есть можно указать интервал [min_key, max_key] и еще один интервал [-, max_priority] и верните содержащиеся в нем точки. Это показано в следующем псевдокоде:

точки search_tree(дерево, min_key, max_key, max_priority) {  корень = get_root_node(дерево)   результат = []    если get_child_count(корень) > 0 {          если get_point_priority(корень) > max_priority      возвращаться ноль // Ничего интересного в этой ветке не будет. Возвращаться    если min_key <= get_point_key(корень) <= max_key // интересует ли корневая точка?       результат.добавить(get_point(узел))       если min_key < get_node_key(корень) // Должны ли мы искать левое поддерево?        результат.добавить(search_tree(корень.left_sub_tree, min_key, max_key, max_priority))    если get_node_key(корень) < max_key // Должны ли мы искать правильное поддерево?        результат.добавить(search_tree(корень.right_sub_tree, min_key, max_key, max_priority))          возвращаться результат  еще { // Это листовой узел    если get_point_priority(корень) < max_priority и min_key <= get_point_key(корень) <= max_key // интересна ли листовая точка?       результат.добавить(get_point(узел))  }}

Смотрите также

Рекомендации

  1. ^ МакКрайт, Эдвард (май 1985 г.). ""Деревья приоритетного поиска"". Журнал SIAM по научным вычислениям. 14 (2): 257–276. Дои:10.1137/0214021.
  2. ^ Ли, Д.Т. (2005). Справочник по структурам данных и приложениям. Лондон: Chapman & Hall / CRC. С. 18–21. ISBN  1-58488-435-5.