Дополненная карта - Augmented map
В Информатика, то дополненная карта[1] является абстрактный тип данных (ADT) на основе заказанного карты, который связывает каждую упорядоченную карту с увеличенная ценность. Для заказанной карты с типом ключа , функция сравнения на и тип значения , увеличенное значение определяется на основе двух функций: база функция и комбинировать функция , где это тип увеличиваемого значения. Базовая функция преобразует одну запись в на увеличенное значение, а функция объединения объединяет несколько дополнительных значений. Функция комбинирования требуется быть ассоциативный и иметь идентичность (т.е. образует моноид ). Расширяем определение ассоциативной функции следующим образом:
Затем увеличенное значение упорядоченной карты определяется следующим образом:
Соответственно, расширенную карту можно формально определить как семикортежную . Например, расширенная карта с целыми ключами и значениями, на которой расширенное значение определяется как сумма всех значений в карте, определяется как:
Как абстрактный тип данных расширенная карта часто используется для моделирования проблем и служит абстракцией с полезным интерфейсом. Он разработан для поддержки быстрых сумм диапазонов, что означает быстрое возвращение увеличенного значения всех записей в определенном ключевом диапазоне.
Интерфейс
Помимо интерфейса для стандартной упорядоченной карты, расширенная карта также должна поддерживать функции для сумм диапазонов. Особенно:
- aug_left: возвращает увеличенное значение всех записей в с ключами не более .
- aug_right: возвращает увеличенное значение всех записей в с ключами не менее .
- aug_left: возвращает увеличенное значение всех записей в с ключами в диапазоне .
- aug_val: возвращает увеличенное значение всех записей в .
Некоторые функции, хотя и не определены на основе расширенных значений, могут использовать расширенные значения для ускорения своих алгоритмов. Обычно они требуют определенного представления расширенных карт и определенных условий для входных параметров.
- aug_filter: возвращает все записи в удовлетворяющий показателю . Это применимо только когда . В этом случае функция aug_filter эквивалентна filter, где и . Когда расширенная карта реализуется с использованием расширенных деревьев, эта функция может быть реализована асимптотически более эффективно, чем наивная реализация.
- aug_project: возвращает . Вот , . Это требует быть моноид и . Эта функция полезна, когда расширенные значения
сами являются картами или другими большими структурами данных. Это позволяет проецировать расширенные значения на другой тип с помощью (например, проецируйте расширенные значения со сложной структурой на такие значения, как их размеры), а затем суммируйте их по , и намного эффективнее, когда это применимо.
Реализация
Дополненные деревья
Расширенная карта может эффективно поддерживаться расширенными деревьями, где каждый узел дерева дополняется расширенным значением всех записей в его поддереве. Из-за ассоциативность функции комбайна , увеличенное значение определенного дерева является фиксированным и не зависит от формы дерева, независимо от поворотов. В этом случае, комбинируя частичные суммы в узлах дерева, любая сумма диапазона может быть возвращена в время на увеличенной карте размера , предполагая, что оба и имеют постоянную стоимость. Для aug_filter древовидная структура использует то преимущество, что если увеличенное значение поддерева не удовлетворяет индикатору , все дерево отбрасывается. В этом случае стоимость aug_filter составляет где - размер вывода. Для aug_project, когда все поддерево попадает в диапазон , его увеличенное значение может быть напрямую объединено с результатом, вместо того, чтобы требовать обхода дерева.
Префиксные структуры
Другая реализация - использовать префиксные структуры,[2] в котором хранится увеличенное значение всех префиксов карты. Для определенной выше расширенной карты , структура префикса представляет собой массив, в котором хранится сумма префиксов значений, отсортированных по их ключам. Структуры префикса особенно полезны для aug_left, но могут быть неэффективными для реализации других функций в интерфейсе расширенной карты. Это может быть полезно в некоторых геометрических алгоритмах.
Пример приложения
1D колющий запрос
Одномерный колющий запрос принимает в качестве входных данных набор интервалов на одномерной числовой строке. Запрос спрашивает, покрыта ли данная точка каким-либо входным интервалом или всеми интервалами, покрывающими эту точку. Для этой проблемы может быть определена расширенная карта, где ключи - это левые конечные точки всех интервалов, значения - соответствующие правые конечные точки, а увеличенное значение - максимальное значение всех правых конечных точек на карте. Более формально:
Чтобы сообщить, покрывает ли какой-либо интервал заданную точку , алгоритм запроса просто определяет, если aug_left. Это потому, что aug_left просматривает все интервалы, начинающиеся до , и если максимальная правая конечная точка среди них превышает , тогда При реализации с расширенными деревьями расширенная карта это точно дерево интервалов. Построение такой расширенной древовидной структуры стоит трудозатрат. , параллельная глубина и Космос. Каждый колющий запрос можно выполнить вовремя .
2D-запрос диапазона
Запрос 2D-диапазона принимает в качестве входных данных набор точек в двух измерениях. Запрос запрашивает все точки (или число) в определенном прямоугольнике, края которого параллельны оси. Для этой проблемы может быть определена расширенная карта, которая представляет собой двухуровневую вложенную структуру карты. На внешней карте хранятся все точки и отсортированы их по x-координатам. Расширенное значение внешней карты - это внутренняя расширенная структура карты, которая хранит тот же набор точек, что и внешняя карта, но сортирует их по их y-координатам. Увеличение внутренних деревьев накапливает количество точек, то есть увеличиваемое значение внутренней карты - это ее размер. Соответственно, функция объединения внешней карты состоит в объединении двух внутренних расширенных карт. Более формально:
Здесь для простоты предположим, что все координаты уникальны. и - это типы координат x и y. Чтобы ответить на запрос диапазона в прямоугольнике , алгоритм запроса извлекает увеличенное значение внешней карты в диапазоне ключей , которая представляет собой внутреннюю карту всех желаемых точек, отсортированных по y-координатам. Следовательно, алгоритм берет другой aug_range на этой внутренней карте и получает результат. Для подсчета запросов алгоритм может использовать функцию aug_project.
Если и внутренняя, и внешняя карты реализованы расширенными деревьями, тогда вся двухуровневая структура карты становится дерево диапазона структура. Если внутренняя карта поддерживается расширенной древовидной структурой, а внешнее дерево поддерживается как префиксная структура, тогда алгоритм становится алгоритм Sweepline.
Другие примеры
Другие примеры[1][2] включать сегментные запросы, поиск по инвертированному индексу, прямоугольные запросы и т. д.
Поддержка Libaray
Параллельная реализация интерфейса расширенной карты предоставляется в библиотеке. PAM.
Заметки
использованная литература
- ^ а б Blelloch, Guy E .; Феризович, Даниэль; Sun, Yihan (2018), "PAM: параллельные дополненные карты", Материалы 23-го симпозиума ACM SIGPLAN по принципам и практике параллельного программирования, ACM, стр. 290–304.
- ^ а б Blelloch, Guy E .; Сунь, Ихан (2018), «Запросы с параллельным диапазоном, сегментами и прямоугольниками с расширенными картами», Запросы с параллельным диапазоном, сегментом и прямоугольником с расширенными картами