ПРИЛОЖЕНИЕ Сентябрь 2012
Секция 5
МАТЕМАТИЧЕСКИЕ ОСНОВЫ ИНФОРМАТИКИ И ПРОГРАММИРОВАНИЯ
УДК 004.021
РЕАЛИЗАЦИЯ МАССОВЫХ ОПЕРАЦИЙ НА МНОГОМЕРНЫХ МАССИВАХ ДАННЫХ
А. Г. Банных
Для эффективной работы с информацией разработаны разнообразные структуры данных. Одна из самых распространённых из них — дерево. Широко известны квадродеревья [1], кд-деревья [2], обобщения дерева отрезков [3] и дерева Фенвика [4]. Существующие структуры данных для работы с многомерными массивами данных позволяют эффективно получать статистическую информацию и изменять отдельные элементы.
Цель настоящей работы заключается в том, чтобы исследовать возможность выполнения массовых обновлений — единообразного изменения областей данных. Ни одна из вышеперечисленных структур данных в чистом виде не предоставляет подобную функциональность. Подробнее с возникающими проблемами можно ознакомиться в [5].
Рассмотрим d-мерное пространство Zd. Пусть x, y G Zd; будем говорить, что x ^ у, если Xk ^ y к для всех k G {1,2,...,d}. Для любого с G Z будем обозначать с = = (с, с,... , c) G Zd; для любых х, у G Zd, x ^ у, положим Pxy = [xi..yi] х [x2..y2] х ... х
x[xd..ydj.
Рассмотрим абелеву группу (G, +) и отображение A : P1n ^ G, n G Z. Можно трактовать A как многомерный массив с множеством индексов Pi,n и множеством допустимых значений ячеек G.
Массовый запрос определим следующим образом: get (A, P) = A(x) .
xGP
Массовое обновление: update(A, P, v) = A' : P1n ^ G, где
A'(x) = { A(x)+ V x G P>
A (x) \ A(x), x GP.
Определим оператор Di следующим образом:
(DiA)(x) = A(xi,... ,Xi,... ,Xd) - A(xi,... ,Xi - 1,... ,Xd),
полагая A(x) = 0 при x G Pi,n. Заменим элементы исходного массива A(x) на линейные
d
многочлены от d переменных C(x)(z) = (D1D2 • • • DdA)(x) П (zi — xi).
i= 1
Утверждение 1. Для области вида P1,z массовый запрос сводится к массовому запросу на массиве C и подстановке переменных:
get(A, Pi,z) = get(C, Pi,z)(z).
Утверждение 2. Для области вида Pxn массовое обновление равносильно единичному обновлению в новом массиве:
d
update(A, Px,n, v) ^ update(C, Px,x, v П (z — Xj)).
i=1
Ослабленным назовем массовый запрос или обновление, для которого применимо утверждение 1 или 2 соответственно.
Утверждение 3. Произвольные массовые обновления и запросы выражаются не более чем через 2d ослабленных.
Утверждения 1-3 позволяют свести задачу с массовыми обновлениями к хорошо изученной задаче с единичными обновлениями. Последнюю можно решать с использованием любых существующих структур данных. Это свойство позволяет делать выбор оптимальной структуры данных для каждой задачи отдельно.
При использовании популярных структур данных асимптотическая оценка на выполнение массовых операций составляет O(log n). При малой размерности пространства эта оценка позволяет говорить об эффективности предлагаемого метода сведения задачи с массовыми обновлениями к задаче с единичными обновлениями. Свобода выбора структуры данных свидетельствует о гибкости метода.
Отметим, что не все задачи выполнения массовых операций на многомерных массивах данных можно сформулировать в терминах, использованных в данной работе. Вопрос об обобщении подхода на более широкие классы задач остаётся открытым.
ЛИТЕРАТУРА
1. Романовский И. В. Дискретный анализ. СПб.: Невский Диалект; БХВ-Петербург, 2008. 336 с.
2. Bentley J. L. Multidimensional binary search trees used for associative searching // Commun. ACM. 1975. V. 18. No. 9. P. 509-517.
3. Препарата Ф., Шеймос М. Вычислительная геометрия. Введение. М.: Мир, 1989. 478 с.
4. Fenwick P. M. A New Data Structure for Cumulative Frequency Tables // Software: Practice and Experience. 1994. V. 24. No. 3. P. 327-336.
5. http://is.ifmo.ru/papers/2011-bachelor-bannykh/ — Банных А. Г. Применение деревьев для реализации массовых операций на многомерных массивах данных [Электронный ресурс]. 2011.
УДК 518.517
АНАЛИЗ АЛГОРИТМОВ ИСПОЛНЯЕМЫХ ФАЙЛОВ ВНУТРИ ПРОГРАММНОЙ ЭВМ С ИЗМЕНЯЕМОЙ СПЕЦИФИКАЦИЕЙ
А. С. Бурлаков
Одним из этапов анализа программного обеспечения является низкоуровневый анализ алгоритмов, скомпилированных в исполняемый файл. Несмотря на то, что данная проблема является довольно популярной, для неё не существует тривиального решения, а имеется набор инструментов и методов [1, с. 3]. Одним из способов решения данной проблемы является использование дизассемблера, чего, однако, часто бывает недостаточно в силу того, что пользователя интересует, каким образом программа взаимодействует с внешними устройствами [2, с. 30-38].