Научная статья на тему 'Применение деревьев для реализации массовых операций на многомерных массивах данных'

Применение деревьев для реализации массовых операций на многомерных массивах данных Текст научной статьи по специальности «Математика»

CC BY
449
38
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
СТРУКТУРЫ ДАННЫХ / DATA STRUCTURES / МАССОВЫЕ ОПЕРАЦИИ / MASS OPERATIONS / МНОГОМЕРНЫЕ МАССИВЫ ДАННЫХ / MULTI-DIMENSIONAL ARRAYS / ДЕРЕВО ОТРЕЗКОВ / SEGMENT TREE / ДЕРЕВО ФЕНВИКА / FENWICK TREE

Аннотация научной статьи по математике, автор научной работы — Банных Антон Геннадьевич

Предлагается метод построения структур данных для выполнения массовых операций на многомерных структурах данных для узкого класса задач. Предлагаемый метод применим в том случае, если элементы многомерной структуры данных принадлежат абелевой группе, и позволяет эффективно выполнять вычисление суммы и прибавление значения к многомерной области.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

TREES APPLICATION FOR MULTI-DIMENSIONAL ARRAY MASS UPDATES

The method of mass operations defining for a subclass of multi-dimensional data structures for a narrow problem class is suggested. The method is applicable in case if multi-dimensional structure elements belong to an abelian group and allows effectively computing the sum of all values in a region and effectively adding a value to any region in multi-dimensional structure.

Текст научной работы на тему «Применение деревьев для реализации массовых операций на многомерных массивах данных»

2. North East European Regional Contest [Электронный ресурс]. - Режим доступа: http://neerc.ifmo.ru, св. Яз. англ. (дата обращения 13.10.2011).

3. Russian Code Cup [Электронный ресурс]. - Режим доступа: http://russiancodecup.ru, св. Яз. англ. (дата обращения 13.10.2011).

4. Правила проведения полуфинала NEERC [Электронный ресурс]. - Режим доступа: http://neerc.ifmo.ru/information/contest-rules.html, св. Яз. рус., англ. (дата обращения 13.10.2011).

5. Мутационное тестирование [Электронный ресурс]. - Режим доступа: http://en.wikipedia.org/wiki/Mutation_testing, св. Яз. англ. (дата обращения 13.10.2011).

6. Ахи А. А. Автоматические методы модификации решений для тестирования проверяющих программ [Электронный ресурс]. - Режим доступа: http://is.ifmo.ru/papers/2011-bachelor-akhi/, св. Яз. рус. (дата обращения 13.10.2011).

7. Покрытие кода [Электронный ресурс]. - Режим доступа: http://en.wikipedia.org/wiki/Code_coverage, св. Яз. англ. (дата обращения 13.10.2011).

8. Cборы команд вузов-участников чемпионата мира по программированию в Петрозаводске [Электронный ресурс]. - Режим доступа: http://karelia.snarknews.info/, св. Яз. рус. (дата обращения 13.10.2011).

9. Интернет-олимпиады по информатике [Электронный ресурс]. - Режим доступа: http://neerc.ifmo.ru/school/io/, св. Яз. рус. (дата обращения 13.10.2011).

Ахи Антон Андреевич - Санкт-Петербургский национальный исследовательский университет ин-

формационных технологий, механики и оптики, студент, anton.akhi@gmail.com

Станкевич Андрей Сергеевич - Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики, доцент, stankev@rain.ifmo.ru

Шалыто Анатолий Абрамович - Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики, доктор технических наук, профессор, зав. кафедрой, shalyto@mail.ifmo.ru

УДК 004.021

ПРИМЕНЕНИЕ ДЕРЕВЬЕВ ДЛЯ РЕАЛИЗАЦИИ МАССОВЫХ ОПЕРАЦИЙ НА МНОГОМЕРНЫХ МАССИВАХ ДАННЫХ А.Г. Банных

Предлагается метод построения структур данных для выполнения массовых операций на многомерных структурах данных для узкого класса задач. Предлагаемый метод применим в том случае, если элементы многомерной структуры данных принадлежат абелевой группе, и позволяет эффективно выполнять вычисление суммы и прибавление значения к многомерной области.

Ключевые слова: структуры данных, массовые операции, многомерные массивы данных, дерево отрезков, дерево Фенвика.

Введение

Для эффективной работы с информацией были разработаны разнообразные структуры данных. Одна из самых распространенных из них - дерево. Существует огромное множество различных типов деревьев. Эти структуры позволяют собирать статистику на отрезках и изменять отдельные элементы. Представление об этих структурах данных можно получить в классических трудах [1-4].

Практически все эти деревья предназначены для данных, на которых можно ввести линейный порядок. В данной работе рассматриваются многомерные массивы данных. Введение нескольких измерений может быть как естественным (растровые изображения и видео), так и искусственным (базы данных). В последнем случае дополнительные измерения позволяют точнее указывать интересующую выборку информации. Широко известны квадродеревья [5], кд-деревья [6], обобщения дерева отрезков [7] и дерева Фенвика [8]. Существующие структуры данных для работы с многомерными структурами данных позволяют эффективно получать статистическую информацию и изменять отдельные элементы.

Цель настоящей работы заключается в том, чтобы исследовать возможность выполнения массовых обновлений - единообразного изменения целых областей данных. Ни одна вышеперечисленная структура данных в чистом виде не предоставляет подобную функциональность. Приведем простой пример. Пусть дан двумерный массив целых чисел размера п х п . Требуется эффективно выполнять две операции - вычислять сумму на прямоугольнике и прибавлять число к прямоугольнику. Оказывается, что добиться асимптотики 0(^2 п) для выполнения этих операций - вовсе не тривиальная задача, как может показаться на первый взгляд. Подробнее о возникающих проблемах можно узнать в работе [9].

ПРИМЕНЕНИЕ ДЕРЕВЬЕВ ДЛЯ РЕАЛИЗАЦИИ МАССОВЫХ ОПЕРАЦИЙ

Постановка задачи

Рассмотрим d -мерное векторное пространство Ud = Zd. Элементы этого пространства будем обозначать жирным шрифтом. Компоненты векторов будем обозначать нижними индексами. Например, x = (xj, x2,.., xd). Введем частичный порядок на элементах этого пространства. Скажем, что x < y » Vk е (1,2..d}xk < yk. Кроме того, будем считать, что 1d = (1,1,...,1) е Ud .

Для любых x, y е Udx < y областью будем называть множество Pxy = [x..y1] х [x2..y2 ] х... x [xd..yd ]. Для повышения читаемости формул будем опускать нижние

индексы в тех случаях, когда это не приводит к неоднозначностям. Будем считать, что мы работаем с областью W = P1N , где N е Ud ,1 < N . Эта область - не что иное, как множество индексов некоторого

d -мерного массива.

Сопоставим индексам значения. Рассмотрим множество G и два бинарных оператора: + и о (+, о: G х G ^ G). Далее оператор + будем называть сложением, а о - умножением. Сложение используется для выполнения массовых запросов, таких как суммирование на прямоугольнике. Умножение используется при выполнении массовых обновлений, таких как умножение всех элементов подпрямоугольника на число.

Рассмотрим функцию A: W ^ G. Можно рассматривать A как многомерный массив с множеством индексов W и множеством допустимых значений ячеек G.

Массовый запрос определим следующим образом:

get (A, P) = ^A(x).

xeP

Массовое обновление определим следующим образом:

update(A, P, v) = A': W ^ G ,

где

Г A(x) о v x e P

A (x) = \ .

[A(x) x g P

Задача состоит в том, чтобы реализовать структуру данных, которая позволила бы эффективно выполнять эти массовые операции.

Чтобы массовые операции имели смысл, на них нужно наложить некоторые ограничения. Обычно полагают, что < G, + > - коммутативная полугруппа, а < G, о > - полугруппа. Кроме того, потребуем выполнения дистрибутивного закона умножения относительно сложения.

Подобная модель описывает не все возможные массовые запросы. Тем не менее, она проста, многие естественные запросы легко описываются в терминах этой модели, и на операции наложены требования, которые учитывают особенности реализации массовых операций в одномерном случае. Это позволяет надеяться на то, что задача имеет эффективное решение.

Настоящая работа посвящена узкому случаю: + = о, < G, + > - абелева группа. Стоит подчеркнуть, что у всех элементов группы существует обратный, т.е. Va е G 3a 1 е G : a + a 1 = 0 . Это свойство лежит в основе всех дальнейших рассуждений.

Основные утверждения

Чтобы упростить дальнейшее изложение, введем несколько операторов. Под ними скрываются преобразования массивов, которые напоминают дифференцирование и интегрирование функций. Для случая одномерной последовательности подобные преобразования хорошо описаны в работе [10].

Префиксом будем называть область вида Pir , R eW . Суффиксом будем называть область вида

PL N, L е W . Обозначим замену i -й компоненты вектора следующим образом: xx , .

i i

Определение 1. Дифференциальный оператор по i -му индексу

DA(x) = A(x) - A(x ^x.-1) .

г г

Определение 2. Интегральный оператор по i -му индексу

x.

StA(x) = ¿A(xx, ^ j).

j=1

Приведем ключевые свойства этих операторов. Для экономии места доказательства тривиальных фактов опущены. Ознакомиться с ними можно в работе [10].

Утверждение 1. Операторы Da и Db коммутируют. Утверждение 2. Операторы Sa и Sb коммутируют.

Утверждение 3. Операторы Si и Di взаимообратны. SiDi = DiSi = E, где E - тождественный оператор.

Утверждение 4. Операторы Sa и Db коммутируют. Определение 3. Дифференциальный оператор D = DlD2 ••• Dd . Определение 4. Интегральный оператор S = SjS2 ••• Sd .

Введение этих операторов позволяет вплотную подобраться к основному результату. Лемма 1. SD = DS = E.

Лемма 2. SA(x) = get (A,P1x). Доказательство.

x1 x2 xd

SA (x) = SjS2 • SdA(x) = ^A(Xx1^;-1x2 ^ ]d) = ^ A(j) = get (A, .

j2 =1 jd =1 1S X Таким образом, запись SA(x) можно воспринимать как обычный запрос на сумму на префиксе.

Обратимся теперь к оператору D . Это вполне определенное преобразование, которое можно совершить с любым массивом. В работе массив DA = B будет храниться в явном виде. Сформулируем некоторые его свойства.

Лемма 3. Сумма на префиксе в преобразованном оператором D массиве данных А есть элемент исходного массива.

Доказательство. Используя лемму 1, получаем: B = DA ^ SB = SDA = EA = A ^ VxSB(x) = A(x).

Полученный результат показывает связь между преобразованным массивом (B) и тем, что был изначально (A). По сути, эта лемма доказывает эквивалентность этих двух массивов, что позволяет хранить лишь один из них. Осталось понять, чем же новый массив лучше старого.

Лемма 4. Изменение одного элемента B влечет изменения целого суффикса массива A = SB . Доказательство. Действительно, выберем произвольные x е W и v е G и предположим, что fB(y) + v y = x

B(y) 'lB(y) y * x

fA(y) + v x < y

Положим A = SB и A' = SB'. Тогда A'(y) = \ J J .

|A(y) x < y

Преобразование данных и запросов

Построим массив B = DA . Один из самых простых способов сделать это - используя определение 3, по очереди применить дифференциальные операторы к исходному массиву.

Преобразование запроса на сумму. Действие оператора S тесно связано с запросом на сумму на префиксе. Например, по леммам 2 и 3 get (A, P1x) = SA(x) = SSB(x).

Последнее можно записать и иначе:

get (A, PM ) = SSB(x) = X X B(z).

1<y<x1<z<y

Значение этой записи интуитивно понятно: сумма превратилась в «сумму сумм».

Преобразование запроса на прибавление. Как было показано в лемме 4, изменение одной ячейки в B эквивалентно массовому прибавлению к суффиксу массива A . Таким образом, массовое обновление сводится к изменению единственной ячейки массива B .

Эквивалентность. На данный момент будет не совсем корректно говорить о решении задачи. Действительно, было показано, чему соответствуют запросы на префиксах или суффиксах, однако исходные запросы формулируются в терминах произвольных областей. В дальнейшем запросы на префиксе для суммы и на суффиксе для обновления будем называть ослабленными. Покажем, что любой запрос можно выразить не более чем через 2d ослабленных.

Чтобы решить эту проблему, нужно воспользоваться формулой включения-исключения. Предположим, необходимо ответить на запрос get (A, Pxy). Предположим, что Xj * 1. Тогда выразим исходный запрос следующим образом:

ПРИМЕНЕНИЕ ДЕРЕВЬЕВ ДЛЯ РЕАЛИЗАЦИИ МАССОВЫХ ОПЕРАЦИЙ ...

Ш* (л ^ ) = ( Л ^ ^ )-( Л р^

У1 ^ ^ -1

Повторяя подобное преобразование для остальных индексов, выразим исходный запрос только через запросы на префиксах. Для этого потребуется не более ё шагов, потому итоговое число запросов не превзойдет 2ё. Аналогично можно выполнить массовые обновления. Здесь снова используется существование обратных элементов, что позволяет одним массовым обновлениям компенсировать другие.

Эффективность. Поскольку большинство алгоритмов работы с многомерными массивами данных содержат O(logd Ы) в своей асимптотике, то умножение на 2ё не изменит асимптотическую оценку.

Решение задачи

Сосредоточимся на выполнении запроса на «сумму сумм». В дальнейшем будет удобно воспользоваться нотацией, предложенной в работе [11]:

IX если утверждение истинно; [утверждение] = <

[0, в противном случае.

Лемма 5. Для любого х < г значение Б(х) входит в БББ(г) ровно П ^ (- х1) раз.

Доказательство. Действительно БББ(г) = II Б(у' ). Количество вхождений значения Б(х) в

1<у < г1< у' < у

эту сумму равно I I [у' = х].

1<у < г1< у' <у

I [у' = х] = Ю Х < У = [х < У] ^ I I [у' = х] = I [х < у]= I 1 = п ^ - X' )•

1<у'<у [0 х < У 1<у<г1<у'<У 1<У<г х<у<г

Будем в каждой ячейке хранить не просто значение Бх, а многочлен Бх П ё=1(^ - Х1), где

заранее не известны. Отметим, что после раскрытия всех скобок получится 2ё слагаемых.

Необходимо пояснить, что подразумевается под умножением элемента абелевой группы < О, + > на число. Можно было бы решить, что мы имеем дело с кольцом, но это не так. Подчеркнем, что все

а

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

коэффициенты целые, поэтому умножение ш е О на число а > 0 есть всего лишь . Аналогично

/=1

определяется эта операция для случая а <0. В итоге приходим к тому, что в каждой ячейке хранится 2ё элементов О . Поскольку это коэффициенты многочлена, то их можно складывать как векторы. Массив, содержащий эти многочлены, обозначим как С .

Рассмотрим I Сх. Получим многочлен, представляющий собой число вхождений

1<х<г

соответствующих элементов в запрос на сумму 5ит(Л, Р1г) (по леммам 2, 3, 5). Это означает, что

^•ит(Л, Р1г) =

I Сх

(г).

Чтобы ответить на запрос на сумму на префиксе, нужно вычислить сумму на префиксе в массиве С, после чего в получившийся многочлен подставить параметры запроса. При выполнении ослабленного запроса на массовое обновление изменяется одна ячейка, т. е. прибавление на суффиксе было сведено к прибавлению нового многочлена к одной ячейке. Таким образом, для решения финальной задачи достаточно поддержки двух запросов: сумма на префиксе и изменение одного элемента. Для решения этой задачи существует множество структур данных, позволяющих выполнять указанные запросы за N).

Оценка потребляемых ресурсов

Время работы. Характерное время обработки запросов популярными структурами данных составляет N). Сведение исходных запросов к ослабленным приводит к не более чем 2ё запросам к структуре. Таким образом, асимптотическая оценка времени обработки одного запроса составляет 0(2ё logd Ы) = N) при фиксированной размерности пространства ё .

Для завершения оценки времени работы осталось определить, какое время занимают элементарные операции над многочленами. Будем считать операцию + в О элементарной, т.е. на ее выполнение уходит 0(1) времени. Тогда после преобразования каждый элемент заменяется на многочлен сте-

пени 2d . Значит, сложение двух многочленов выполняется за O(2d ). Таким образом, асимптотической оценкой времени выполнения запроса осталось O(logd N) .

Обратимся теперь к массовым обновлениям. По аналогии с предыдущими рассуждениями можно считать, что ослабление запросов не ведет к ухудшению асимптотики. Единственное, с чем осталось разобраться, - построение нового многочлена.

Ключевой вопрос - за какое время можно выполнять умножение на целое число. Если мы имеем дело с примитивными типами данных, то эту операцию можно выполнить за O(1) встроенными командами процессора. В иных случаях можно представить умножение на число через O(log(L)) операций + , где L - абсолютное значение множителя [12]. Коэффициенты многочлена не превышают Nd, поэтому общая оценка времени, затраченного на построение нового многочлена, есть O(2d log(Nd )) = O(logd N).

Память. Потребление памяти зависит от используемой структуры данных, поэтому сложно привести какие-либо конкретные оценки. Тем не менее, можно уверенно утверждать, что после всех преобразований потребление памяти возрастет не менее чем в 2d раз, что связано с хранением многочленов. Кроме того, в случае разреженных данных количество ненулевых ячеек может также возрасти, но не более чем в 2d раз.

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

Заключение

В работе был выбран частный случай массовых операций: + = о, < G, + > - абелева группа. Для него был разработан общий метод сведения задачи с массовыми обновлениями к хорошо изученной задаче без них. Разработанный метод можно использовать с любыми существующими структурами данных. Это свойство позволяет делать выбор оптимальной структуры данных для каждой задачи отдельно. Например, если используются все ячейки массива, то стоит сделать выбор в пользу дерева Фенвика. С другой стороны, в случае сильно разреженных данных можно использовать разреженное дерево отрезков. Подобная гибкость позволяет применять метод в различных областях.

Таким образом, метод получился универсальным настолько, насколько это возможно для данной задачи. К сожалению, вопрос об обобщении метода на более широкие классы задач остается открытым.

Литература

1. Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ. - 2-e изд. - M.: MЦНMО, 2010. - 129б с.

2. Шень А. Программирование: теоремы и задачи. - 2-e изд. - M.: MЦНMО, 2004. - 29б с.

3. Tarjan R.E. Data Structures and Network Algorithms. - PA.: Society for Industrial Mathematics, 19S3. - 140 p.

4. Кнут Д.Э. Искусство программирования. Т. 3. Сортировка и поиск. - M.: Вильямс, 2007. - S24 с.

5. Романовский И.В. Дискретный анализ. - 4-е изд. - СПб: Невский Диалект; БХВ-Петербург, 200S. -33б с.

6. Bentley J.L. Multidimensional binary search trees used for associative searching // Communications of the ACM. - 1975. - V. 1S. - № 9. - P. 509-517.

7. Препарата Ф., Шеймос M. Вычислительная геометрия: Введение. - M.: M^, 19S9. - 47S с.

S. Fenwick P.M. A New Data Structure for Cumulative Frequency Tables // Software: Practice and experience. - 1994. - V. 24 - № 3. - P. 327-33б.

9. Кнут Д., Грэхем Р., Паташник О. Конкретная математика. Основание информатики. - M.: Вильямс, 2005. - 7S4 с.

10. Банных А.Г. Применение деревьев для реализации массовых операций на многомерных массивах данных [Электронный ресурс]. - Режим доступа: http://is.ifmo.ru/papers/2011-bachelor-bannykh/, св. Яз. рус. (дата обращения 25.11.2011).

11. Кнут Д.Э. Искусство программирования. Т. 1. Основные алгоритмы. - M.: Вильямс, 2007. - 720 с.

12. Brauer A. On addition chains // Bulletin of the American Mathematical Society. - 1939. - V. 45. - № 10. -P. 73б-739.

Банных Антон Геннадьевич - Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики, студент, anton.bannykh@gmail.com

i Надоели баннеры? Вы всегда можете отключить рекламу.