Тон или стиль этой статьи может не отражать энциклопедический тон , используемый в Википедии . ( Декабрь 2017 ) |
В информатике проблема запроса диапазона состоит в эффективном ответе на несколько запросов относительно заданного интервала элементов в массиве . Например, распространенная задача, известная как запрос минимума диапазона , заключается в поиске наименьшего значения внутри заданного диапазона в списке чисел.
Учитывая функцию , которая принимает массив, запрос диапазона для массива принимает два индекса и и возвращает результат при применении к подмассиву . Например, для функции , которая возвращает сумму всех значений в массиве, запрос диапазона возвращает сумму всех значений в диапазоне . [ необходима цитата ]
Запросы суммы диапазона могут быть получены за постоянное время и линейное пространство путем предварительного вычисления массива p той же длины, что и входные данные, так что для каждого индекса i элемент p i является суммой первых i элементов a . Любой запрос может быть затем вычислен следующим образом:
Эту стратегию можно распространить на любую другую бинарную операцию , обратная функция которой хорошо определена и легко вычисляется. [1] Ее также можно распространить на более высокие измерения с аналогичной предварительной обработкой. [2] Например, если p i,j содержит сумму первых i × j элементов a , то
Более сложная подгруппа проблемы состоит из выполнения запросов диапазона на динамических данных; то есть данных, которые могут мутировать между каждым запросом. Для эффективного обновления значений массива необходимы более сложные структуры данных, такие как дерево сегментов или дерево Фенвика . [ необходима цитата ]
Когда интересующая функция в запросе диапазона является полугрупповым оператором, понятие не всегда определено, поэтому стратегия в предыдущем разделе не работает. Эндрю Яо показал [3] , что существует эффективное решение для запросов диапазона, которые включают полугрупповые операторы. Он доказал, что для любой константы c предварительная обработка времени и пространства позволяет отвечать на запросы диапазона в списках, где f является полугрупповым оператором по времени, где является определенным функциональным обращением функции Аккермана .
Существуют некоторые операторы полугрупп, которые допускают немного лучшие решения. Например, когда . Предположим , то возвращает индекс минимального элемента . Затем обозначает соответствующий запрос минимального диапазона. Существует несколько структур данных, которые позволяют ответить на запрос минимального диапазона во времени, используя предварительную обработку времени и пространства . Одно из таких решений основано на эквивалентности между этой проблемой и проблемой наименьшего общего предка .
Декартово дерево массива имеет в качестве корня и в качестве левого и правого поддеревьев декартово дерево и декартово дерево соответственно. Запрос на минимальный диапазон является наименьшим общим предком в и . Поскольку наименьший общий предок может быть решен за постоянное время с использованием предварительной обработки времени и пространства , запрос на минимальный диапазон также может быть решен. Решение при аналогично. Декартовы деревья могут быть построены за линейное время .
Режим массива — это элемент, который появляется в нем чаще всего. Например, режим — это4 . В случае равенства любой из наиболее частых элементов может быть выбран в качестве моды. Запрос диапазона моды заключается в предварительной обработке, так что мы можем найти моду в любом диапазоне . Для решения этой проблемы было разработано несколько структур данных, мы суммируем некоторые результаты в следующей таблице. [1]
Космос | Время запроса | Ограничения |
---|---|---|
Недавно Йоргенсен и др. доказали нижнюю границу для модели клеточного зонда для любой структуры данных, которая использует S- клетки. [4]
Этот частный случай представляет особый интерес, поскольку нахождение медианы имеет несколько приложений. [5] С другой стороны, медианная задача, частный случай задачи выбора , разрешима за O ( n ), используя алгоритм медианы медиан . [6] Однако ее обобщение посредством запросов на медиану диапазона появилось недавно. [7] Запрос на медиану диапазона , где A,i и j имеют обычные значения, возвращает элемент медианы . Эквивалентно, должен возвращать элемент ранга . Запросы на медиану диапазона не могут быть решены с помощью любого из предыдущих методов, обсуждавшихся выше, включая подход Яо для операторов полугруппы. [8]
Были изучены два варианта этой проблемы: офлайн -версия, где все k интересующих запросов задаются в пакете, и версия, где вся предварительная обработка выполняется заранее. Офлайн-версия может быть решена с помощью времени и пространства.
Следующий псевдокод алгоритма быстрого выбора показывает, как найти элемент ранга r в несортированном массиве различных элементов, чтобы найти заданные нами медианы диапазона . [7]
rangeMedian(A, i, j, r) { если A.length() == 1 вернуть A[1] если A.low не определен , то m = медиана(A) A.low = [e в A | e <= m] A.high = [e в A | e > m ] вычислить t количество элементов A[i, j], которые принадлежат A.low если r <= t, то вернуть rangeMedian(A.low, i, j, r), иначе вернуть rangeMedian(A.high, i, j, rt)}
Процедура rangeMedian
разбивает A
, используя A
медиану , на два массива A.low
и A.high
, где первый содержит элементы , A
которые меньше или равны медиане m
, а второй — остальные элементы A
. Если мы знаем, что количество элементов , которые попадают в , равно и это число больше , то мы должны продолжать искать элемент ранга в ; в противном случае мы должны искать элемент ранга в . Чтобы найти t , достаточно найти максимальный индекс такой, что находится в , и максимальный индекс такой, что
находится в . Тогда . Общая стоимость любого запроса, без учета части разбиения, равна , поскольку выполняется максимум рекурсивных вызовов и в каждом из них выполняется только постоянное количество операций (чтобы получить значение t , следует использовать дробное каскадирование ). Если используется линейный алгоритм для поиска медиан, общая стоимость предварительной обработки для медианных запросов в диапазоне k составляет . Алгоритм также можно модифицировать для решения онлайн- версии задачи. [7]A.low
t
r
r
A.low
A.high
A.low
A.high
Поиск частых элементов в заданном наборе элементов является одной из самых важных задач в интеллектуальном анализе данных. Поиск частых элементов может быть сложной задачей, когда большинство элементов имеют схожие частоты. Поэтому может быть более полезным, если для обнаружения таких элементов используется некоторый порог значимости. Один из самых известных алгоритмов для поиска большинства в массиве был предложен Бойером и Муром [9] , который также известен как алгоритм большинства голосов Бойера–Мура . Бойер и Мур предложили алгоритм для поиска большинства элемента строки (если он есть) во времени и с использованием пространства. В контексте работы Бойера и Мура и вообще говоря, большинство элементов в наборе элементов (например, строки или массива) — это тот, количество экземпляров которого составляет более половины размера этого набора. Несколько лет спустя Мисра и Грис [10] предложили более общую версию алгоритма Бойера и Мура, использующую сравнения для поиска всех элементов в массиве, относительные частоты которых больше некоторого порога . Запрос range -majority — это запрос, который, учитывая поддиапазон структуры данных (например, массив) размером , возвращает набор всех отдельных элементов, которые появляются более (или в некоторых публикациях равно) раз в этом заданном диапазоне. В различных структурах, которые поддерживают запросы range -majority, может быть либо статическим (указывается во время предварительной обработки), либо динамическим (указывается во время запроса). Многие из таких подходов основаны на том факте, что независимо от размера диапазона для заданного может быть не более отдельных кандидатов с относительными частотами не менее . Проверяя каждого из этих кандидатов за постоянное время, достигается время запроса. Запрос range -majority является разложимым [11] в том смысле, что -majority в диапазоне с разделами и должно быть -majority в либо . Благодаря этой разложимости некоторые структуры данных отвечают на большинство запросов на одномерных массивах, находя наименьшего общего предка (LCA) конечных точек диапазона запроса в дереве диапазонов и проверяя два набора кандидатов (размером ) от каждой конечной точки до наименьшего общего предка за постоянное время, что приводит к времени запроса.
Gagie et al. [12] предложили структуру данных, которая поддерживает запросы range-majority на массиве . Для каждого запроса в этой структуре данных указываются порог и прямоугольный диапазон , а набор всех элементов, которые имеют относительные частоты (внутри этого прямоугольного диапазона) больше или равные, возвращается в качестве выходных данных. Эта структура данных поддерживает динамические пороги (указанные во время запроса) и порог предварительной обработки, на основе которого она строится. Во время предварительной обработки на массиве строится набор вертикальных и горизонтальных интервалов . Вместе вертикальный и горизонтальный интервалы образуют блок. Каждый блок является частью суперблока, который в девять раз больше его самого (в три раза больше размера горизонтального интервала блока и в три раза больше размера его вертикального). Для каждого блока хранится набор кандидатов (с элементами не более), который состоит из элементов, которые имеют относительные частоты не менее (порог предварительной обработки, как указано выше) в его соответствующем суперблоке. Эти элементы хранятся в невозрастающем порядке в соответствии с их частотами, и легко увидеть, что любой элемент, имеющий относительную частоту хотя бы в блоке, должен появиться в его наборе кандидатов. На каждый запрос -majority сначала отвечают путем нахождения блока запроса или самого большого блока, который содержится в предоставленном прямоугольнике запроса за время. Для полученного блока запроса первые кандидаты возвращаются (без проверки) за время, поэтому этот процесс может возвращать некоторые ложные срабатывания. Многие другие структуры данных (как обсуждается ниже) предложили методы для проверки каждого кандидата за постоянное время и, таким образом, поддержания времени запроса при отсутствии ложных срабатываний. Случаи, в которых блок запроса меньше, обрабатываются путем сохранения различных экземпляров этой структуры данных в следующей форме:
где — порог предварительной обработки -го экземпляра. Таким образом, для блоков запроса, меньших, чем -й экземпляр, запрашивается. Как упоминалось выше, эта структура данных имеет время запроса и требует бит пространства, сохраняя его копию, закодированную по Хаффману (обратите внимание на фактор, а также см. кодирование Хаффмана ).
Чан и др. [13] предложили структуру данных, которая при заданном одномерном массиве , поддиапазоне ( указанном во время запроса) и пороге (указанном во время запроса) способна возвращать список всех -большинств за время, требующее слов пространства. Чтобы ответить на такие запросы, Чан и др. [13] начинают с того, что отмечают, что существует структура данных, способная возвращать самые частые элементы top-k в диапазоне за время, требующее слов пространства. Для одномерного массива пусть односторонний запрос top-k диапазона имеет вид . Для максимального диапазона диапазонов , в котором частота отдельного элемента в остается неизменной (и равной ), строится горизонтальный отрезок линии. -Интервал этого отрезка линии соответствует и он имеет -значение, равное . Поскольку добавление каждого элемента к изменяет частоту ровно одного отдельного элемента, вышеупомянутый процесс создает отрезки линии. Более того, для вертикальной линии все пересекающие ее горизонтальные отрезки линии сортируются в соответствии с их частотами. Обратите внимание, что каждый горизонтальный отрезок линии с -интервалом соответствует ровно одному отдельному элементу в , так что . Затем на запрос top-k можно ответить, испуская вертикальный луч и сообщая о первых горизонтальных отрезках линии, которые пересекают его (помните из вышеизложенного, что эти отрезки линии уже отсортированы в соответствии с их частотами) во времени.
Чан и др. [13] сначала строят дерево диапазонов , в котором каждый узел ветвления хранит одну копию структуры данных, описанной выше для односторонних запросов диапазона top-k, а каждый лист представляет элемент из . Структура данных top-k в каждом узле строится на основе значений, существующих в поддеревьях этого узла, и предназначена для ответа на односторонние запросы диапазона top-k. Обратите внимание, что для одномерного массива дерево диапазонов можно построить путем деления на две половины и рекурсии на обеих половинах; следовательно, каждый узел полученного дерева диапазонов представляет собой диапазон. Также можно увидеть, что это дерево диапазонов требует слов пространства, потому что есть уровни, а на каждом уровне есть узлы. Более того, поскольку на каждом уровне дерева диапазонов все узлы имеют в своих поддеревьях в общей сложности элементов и поскольку есть уровни, пространственная сложность этого дерева диапазонов составляет .
Используя эту структуру, запрос диапазона -majority на с отвечает следующим образом. Во-первых, наименьший общий предок (LCA) листовых узлов и находится за постоянное время. Обратите внимание, что существует структура данных, требующая бит пространства, которая способна отвечать на запросы LCA за время. [14] Пусть обозначит LCA и , используя и в соответствии с разложимостью запросов диапазона -majority (как описано выше и в [11] ), двусторонний запрос диапазона может быть преобразован в два односторонних запроса диапазона top-k (от до и ). Эти два односторонних запроса диапазона top-k возвращают top-( ) наиболее частые элементы в каждом из их соответствующих диапазонов по времени. Эти частые элементы составляют набор кандидатов для -majorities в , в котором есть кандидаты, некоторые из которых могут быть ложноположительными. Затем каждый кандидат оценивается за постоянное время с использованием линейно-пространственной структуры данных (как описано в лемме 3 в [15] ), которая способна определить за время, содержит ли заданный поддиапазон массива по крайней мере экземпляры определенного элемента .
Gagie et al. [16] предложили структуру данных, которая поддерживает запросы, такие, что при наличии двух узлов и в дереве они могут сообщать список элементов, которые имеют большую относительную частоту, чем на пути от до . Более формально, пусть будет помеченным деревом, в котором каждый узел имеет метку из алфавита размера . Пусть обозначит метку узла в . Пусть обозначит уникальный путь от до в , в котором средние узлы перечислены в порядке их посещения. При наличии и фиксированного (указанного во время предварительной обработки) порога , запрос должен возвращать набор всех меток, которые встречаются более раз в .
Для построения этой структуры данных сначала узлы помечаются . Это можно сделать, пометив любой узел, который находится на расстоянии не менее от нижней части трех (высота) и глубина которого делится на . После этого можно заметить, что расстояние между каждым узлом и его ближайшим помеченным предком меньше . Для помеченного узла хранятся различные последовательности (пути к корню) ,
для , где возвращает метку прямого родителя узла . Иными словами, для каждого отмеченного узла хранится набор всех путей с длиной, равной степени двух (плюс один для самого узла) к корню. Более того, для каждого хранится набор всех кандидатов большинства. Более конкретно, содержит набор всех -большинств в или меток, которые появляются больше, чем раз в . Легко видеть, что набор кандидатов может иметь не более различных меток для каждого . Затем Гаги и др. [16] отмечают, что набор всех -большинств в пути от любого отмеченного узла до одного из его предков включен в некоторые (лемма 2 в [16] ), поскольку длина равна , таким образом, существует для , длина которого находится между , где - расстояние между x и z. Существование таких подразумевает, что -большинство в пути от до должно быть -большинством в , и, таким образом, должно появляться в . Легко видеть, что эта структура данных требует слов пространства, потому что, как упоминалось выше, на этапе построения узлы помечаются, и для каждого помеченного узла хранятся некоторые наборы кандидатов. По определению, для каждого помеченного узла такие наборы являются хранилищами, каждое из которых содержит кандидатов. Поэтому эта структура данных требует слов пространства. Обратите внимание, что каждый узел также хранит что равно количеству экземпляров на пути от к корню , это не увеличивает сложность пространства, поскольку добавляет только постоянное количество слов на узел.
На каждый запрос между двумя узлами и можно ответить, используя свойство разложения (как объяснено выше) запросов range -majority и разбив путь запроса между и на четыре подпути. Пусть будет наименьшим общим предком и , причем и будут ближайшими отмеченными предками и соответственно. Путь от до разлагается на пути от и до и соответственно (размер этих путей меньше, чем по определению, все из которых рассматриваются как кандидаты), и пути от и до (путем нахождения подходящего , как объяснено выше, и рассмотрения всех его меток как кандидатов). Обратите внимание, что граничные узлы должны обрабатываться соответствующим образом, чтобы все эти подпути были непересекающимися, и из всех них выводится набор кандидатов. Затем каждый из этих кандидатов проверяется с помощью комбинации запроса , который возвращает наименьшего предка узла , имеющего метку, и полей каждого узла. На -битной оперативной памяти и алфавите размером запрос может быть дан за время, имея линейные требования к пространству. [17] Таким образом, проверка каждого из кандидатов во времени приводит к общему времени запроса для возврата набора всех -большинств на пути от до .
Все проблемы, описанные выше, были изучены для более высоких измерений, а также их динамических версий. С другой стороны, запросы диапазона могут быть расширены на другие структуры данных, такие как деревья , [8], такие как проблема предка уровня . Похожее семейство проблем — это запросы ортогонального диапазона , также известные как запросы подсчета.