Структура данных для создания ассоциативного массива на основе монотонных хеш-функций

УДК 519.72

Д.В. Поляков, А.И. Попов, С.А. Дузькрятченко

СТРУКТУРА ДАННЫХ ДЛЯ СОЗДАНИЯ АССОЦИАТИВНОГО МАССИВА НА ОСНОВЕ МОНОТОННЫХ ХЕШ-ФУНКЦИЙ

Тамбовский государственный технический университет

Цель: Снижение сложности алгоритмов решения задач поиска ближайшего объекта, интервального поиска, путём разработки структуры данных для создания хеш-таблицы на основе монотонных хеш-функций. Подход: Методика исследований основана на теории множеств, теории информационного поиска и теории алгоритмов.

Результаты: Предложена структура данных для создания ассоциативного массива на основе монотонных хеш-функций, алгоритмы работы с ней и проведён сравнительный анализ предложенной и существующих структур данных для хеш-таблиц.

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

Ключевые слова: хеш-таблица, хеш-функция, ассоциативный массив, задача поиска идентичных объектов, задача о близости, задача интервального поиска, интервальный поиск, информационный поиск.

Хранение и поиск информации, безусловно, являются ключевыми процессами любой информационной системы (ИС). Их эффективная реализация рассматривается в двух важнейших областях современной информатики: теории информационного поиска и теории баз данных. Однако задачи информационного поиска крайне разнообразны. Так, Гасанов и Кудрявцев в своей работе «Теория хранения и поиска информации» [ 1] выделяют базовые задачи информационного поиска. Они охарактеризованы наличием таких объектов, как «запрос», представляющий собой некий минимальный элемент, задающий семантику интересов пользователя; «запись» - поисковый образ данных, представленный обычно в виде множества полей базы данных, и «отображение», позволяющее определить подмножество записей, которое необходимо вернуть в ответ на соответствующий запрос. Таким образом, по Гасанову, задача информационного поиска, формализуется кортежем

<X,Y,p:X-P

где X - это универсум запросов, Y - множество записей, р - отображение, а P (Y) - булеан (множество всех подмножеств) Y.

Вместе с тем, существует широкий класс задач, в котором само построение отображения р нетривиально. Например, задачи поиска текстовых сведений ставят вопрос о релевантности и пертинентности результатов информационного поиска. Под релевантностью понимается соответствие результатов информационного поиска запросу пользователя, а под пер-тинентностью - соответствие полученных результатов его информационной потребности [2]. Эти понятия были рассмотрены в работах Ландэ, Санарского, Безсудного, Робертсона и других [3-10]. По сути, определение множества документов, релевантных запросу пользователя или пертинентных его информационным потребностям, и есть построение отображения р.

На сегодняшний день разработано множество механизмов определения релевантности и пертинентности: начиная с расширенной булевой и пространственно-векторной моделей, разработанных Солтоном, Фоксом, Ву [11-14], заканчивая методами text meaning, компьютерной лингвистики и анализа коллокаций термов [15-21].

Однако при построении отображения р или же, имея его в тривиальном виде, мы

© Поляков Д.В., Попов А.И., Дузькрятченко С.А., 2015.

сталкиваемся с задачей информационного поиска (1). Существует её тривиальное решение, заключающиеся в последовательном обходе множества У и проверки каждого уеУ на принадлежность результату отображения запроса. Такой подход вполне применим, однако крайне неэффективен с позиции алгоритмической сложности решения задач информационного поиска.

Вместе с тем, даже несмотря на постоянный рост вычислительной мощности комплектующих ИС, эффективные с позиции времени решения задач информационного поиска являются крайне важными для современных ИС. Это происходит из-за того, что увеличение объёмов обрабатываемой информации существенно опережает рост вычислительной мощности устройств. На сегодняшний день существует широкий класс задач, например, задачи мониторинга или учёта, предполагающих статистическую или интеллектуальную обработку накопленных данных и потому требующих выполнения огромного числа различного вида поисковых запросов. Кроме того, работа с данными зачастую происходит по сети, что приводит к дополнительным временным потерям. Такая ситуация свидетельствует о несомненной актуальности исследований в области структур данных и алгоритмов, позволяющих эффективно решать задачи информационного поиска вида (1).

Рассмотрим основные подвиды задачи (1) более подробно:

• задачи поиска с коротким ответом [1] - подвид задачи (1), в которых результат работы отображения р содержит ограниченное подмножество У. Задачи с коротким ответом, в свою очередь, разделяются на следующие типы:

a) задача поиска идентичных объектов, которая заключается в нахождении объекта идентичного объекту-запросу - она рассмотрена в работах Гасанова, Ландиса, Белобродско-го, Решетникова, Фергюсона и других [1, 22-26];

b) задача о близости, заключающаяся в поиске на множестве с заданным линейным бинарным отношением порядка или предпорядка объекта, ближайшего к объекту-запросу и исследованная в работах Гасанова, Ювала, Фредмана, Брукхарда, Минского и других [1, 26-29];

• задача интервального поиска [1], заключающаяся в поиске на множестве с заданными линейными бинарными отношениями порядка или предпорядка элементов находящихся в интервале, определённом поисковым запросом. Эти задачи также были исследованы во многих работах [1, 30-38].

Для решения рассмотренных задач информационного поиска используется два вида структур данных с алгоритмами их обработки: деревья и хеш-таблицы [39, 40]. Под деревьями, в данном случае, понимаются связные ациклические графы. Такие структуры данных, повышающие скорость поиска хранимых в них элементов, называют ассоциативными массивами [39].

Хранение данных с помощью деревьев в большинстве случаев представлено такой структурой, как бинарное дерево и множеством обслуживающих его алгоритмов. Различные алгоритмы обработки бинарных деревьев определяют разные виды построенных на них ассоциативных массивов, таких как, например, АВЛ-деревья, вероятностные деревья, красно-чёрные деревья [39, 40].

Сложность поиска идентичных объектов и решения задачи о близости на эффективных бинарных деревьях как в среднем, так и в худшем случае, пропорциональна логарифму от количества хранимых записей. Вместе с тем, сложность задачи интервального поиска может меняться и, зачастую, довольно высока из-за того, что переход к следующему элементу является нетривиальной задачей с неконстантной (зависящей от количества хранимых записей) алгоритмической сложностью.

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

В данной работе предлагается структура данных, которая, в случае использования её для построения хеш-таблицы, при определённых условиях позволит улучшить средние и худшие показатели скорости решения задач о близости и интервального поиска.

Сравнительный анализ хеш-таблиц

Идея хранения и поиска данных на основе хеш-таблицы состоит в том, чтобы построить отображение из множества У на множество {пеЫ0 | п<т}, где т - некоторое число, ограничивающие область допустимых значений отображения, а Ы0 - множество натуральных чисел и 0. Такое отображение называется хеш-функцией. Для рассматриваемого множества допустимых значений хеш-функции, ограниченного сверху натуральным числом т обозначим хеш-функцию как Ит:У^{п^Ы0 | п<т}.

В качестве структуры данных для создания хеш-таблицы обычно используется индексный массив или некоторое его обобщение.

Индексный массив представляет собой коллекцию записей расположенных в КЛЫ-памяти последовательно, что позволяет, зная индекс, вычислить адрес записи, и в силу свойств КЛЫ-памяти обратиться к записи за константное время.

Пусть Лт - индексный массив, а Лт[/] - его /-тый элемент, 0<1<т. При добавлении записи в хеш-таблицу вычисляется с помощью хеш-функции индекс массива и соответствующему его элементу присваивается запись. То есть добавление записи уеУ выглядит как Лт[Ит(у)] :=у, где символ := означает присваивание.

Тогда решение задачи поиска идентичного объекта будет тривиальным: если для нашего запроса хеХ Лт[кт(х)] = х, то элемент найден, в противном случае данный элемент в хеш-таблице отсутствует.

Для сравнительной оценки эффективности работы ассоциативных массивов исследуем потребляемые ими ресурсы, такие как сложность алгоритмов решения тех или иных задач и объём требуемой ассоциативному массиву памяти. Вместе с тем, оценка данных величин в абсолютных значениях крайне затруднительна, ибо они зависят от технических характеристик устройств, на которых запускаются алгоритмы, а для хеш-таблиц ещё и от самого множества записей - У. В качестве способа оценки сложности алгоритмов и используемой хеш-таблицей памяти воспользуемся классическим подходом: оценкой асимптотической сложности с помощью О-нотации. Этот подход широко используется, а его адекватность хорошо исследована, например, в работах Кнута, Кормена, Лейзерсона, Ривеста, Штайна [39, 41] и других.

Вернёмся к рассмотрению хеш-таблиц. Из рассмотренных алгоритмов следует, что время поиска и добавления элемента в хеш-таблицу не зависит от количества хранимых элементов, то есть оно константно, что на языке О-нотации обозначается как О(1). Это хорошая оценка, так как большинство ассоциативных массивов, работающих на основе деревьев, имеют асимптотическую сложность для тех же операций O(log п).

Вместе с тем, при решении задачи поиска идентичного объекта у хеш-таблиц имеют место два существенных недостатка:

• в массиве Лт присутствуют пустые ячейки, что в отличие от ассоциативных массивов

на основе деревьев, приводит к существенному перерасходу памяти;

• существует возможность коллизий - ситуаций, когда две разных записи хеш-функция

отображает в один и тот же индекс.

Стоит отметить, что зачастую, в случае использования хеш-функций с хорошими характеристиками, верно правило: чем меньше в хеш-таблице лишней памяти, тем больше в ней коллизий.

Для решения проблемы коллизий существует множество подходов. Рассмотрим подробнее основные [39, 40].

1. Линейное зондирование - метод, при котором в случае возникновения коллизии осуществляется линейных проход по массиву с поиском незанятых ячеек для вставки эле-

мента. Очевидным плюсом линейного зондирования является снижение объёма лишней памяти. Однако при поиске записи, в случае, если она была вставлена в массив путём линейного зондирования время работы алгоритма, которому в процессе поиска приходится повторять весь путь до искомого объекта, деградирует вплоть до O(n). А O(n) соответствует оценке простейшего алгоритма полного перебора.

2. Двойное хеширование - метод, который обрабатывает коллизии путём взятия новой хеш-функции, задающей циклический сдвиг по Am. Поиск осуществляется путём того же циклического сдвига. Плюсы и минусы двойного хеширования аналогичны линейному зондированию, с той лишь разницей, что удачный выбор второй хеш-функции позволит уменьшить число повторных коллизий в сравнении с линейным зондированием. С другой стороны, применяемые на практике в качестве отображений для повторного хеширования, квадратичные функции [40] могут привести к тому, что добавление элемента будет невозможно, при наличии в Am большого количества пустых ячеек. Такая ситуация может произойти из-за того, что циклический сдвиг в общем случае не будет обходить все элементы массива, в отличие от процесса поиска свободного места на основе линейного зондирования.

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

• метод цепочек переполнения, заключающийся в том, что каждый элемент Am является началом линейного списка, в который и добавляются записи, попавшие в данную ячейку;

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

• механизм разрешения коллизий, основанный на использовании для каждой ячейки своей отдельной хеш-таблицы.

Основным недостатком хеш-таблиц, рассмотренных в третьем пункте списка, при решении задачи поиска идентичного объекта является, то, что в отличие от линейного зондирования и двойного хеширования, в ассоциативном массиве хранится большой объём пустых ячеек. При этом, хотя поиск идентичного объекта в среднем осуществляется за 0(1), благодаря выбору хорошей хеш-функции, минимизирующей коллизии, в случае их возникновения решаемая задача сводится к поиску среди хранимых записей, составляющих с коллизию запросом. Сложность такого поиска определяется структурой данных, разрешающей коллизию (список/дерево/хеш-таблица) относительно мощности множества записей, составляющих коллизию с объектом-запросом. В дальнейшем такое множество будем называть коллизионным доменом запроса.

Пусть С - некоторый алгоритм разрешения коллизий. Тогда хеш-таблица задаётся набором элементов

<hm, Am, C>.

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

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

Отметим, что требование монотонности к хеш-функциям при решении задач о близости или интервального поиска корректны, так как в формулировке обеих задач присутствует условие наличия отношения порядка или предпорядка на множестве Y. Более того, в рамках информатики данное условие никак не ограничивает общность поисковой задачи в силу того, что на множестве любых, хранящихся в памяти компьютера, объектов можно установить отношение порядка. Действительно, если даже объекты не имеют естественного подхода к

установлению такого бинарного отношения, как, например, лексикографический порядок на множестве строк или порядок, задаваемый отношениями «<» и «>», на любом числовом множестве, они всё равно представляют собой битовые последовательности, которые можно интерпретировать как числа в двоичной системе счисления.

На сегодняшний день предложено и исследовано большое количество монотонных хеш-функций. Эти исследования представлены в работах Гасанова, Белазегуа, Болди, Дрос-соса и других [1, 42-44]. Кроме того, монотонные хеш-функции представлены и в работах [45-48], например, в статье «Генератор монотонных хеш-функций для ассоциативного массива» был предложен метод получения хеш-функции на основе генератора с использованием произвольных непрерывных строго возрастающих биекций из множества хранимых записей на отрезок [0, 1] [48].

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

Пусть имеем задачу информационного поиска вида (1), которая решается посредствам хеш-таблицы вида (2). Пусть |У| = п, то есть п определяет количество хранимых записей.

Активной вершиной назовём элемент Лт[/], если (Зу еУ)(Нт (у) = /). Другими словами, активными вершинами будем называть все ячейки массива Лт, в которые попадают записи У при построении отображения этих записей с помощью хеш-функции.

Пассивной вершиной назовём элемент Лт[/], если (Ууе7\Нт(уI). Другими словами пассивными вершинами будем называть все ячейки массива Лт, в которые в результате построения отображения с помощью хеш-функции для элементов множества У не попало ни одной записи.

Пустыми вершинами назовём все ячейки массива Лт, которые не хранят в себе записи. Заполненными вершинами назовём все ячейки массива Лт, которые хранят в себе запись и не являются активными.

Отметим, что в данных ранее определениях ячейки массива Лт названы вершинами. Это было из-за того, что предлагаемую в данной статье структуру данных удобно рассматривать как граф, частью вершин которого будут ячейки массива Лт. В дальнейшем будем называть как вершинами, так и ячейками в зависимости от контекста.

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

Утверждение: из монотонности хеш-функции следует, что ближайшая к искомой (х) запись попала либо в ту же вершину, что и х, либо в одну из соседних по Лт активных вершин. Докажем утверждение. Предположим противное: ближайшая запись к запросу х не попала ни в ячейку Лт[Нт(х)] ни в соседние к ней активные вершины. Представим соседние непустые элементы как Лт[ Нт (х) -б! ] и Лт[ Нт (х) + 82 ], где 81 и 52 - некоторые натуральные числа. Обозначим искомую запись ух, ухеУ. Тогда

Ит

Действительно, в противном случае, если бы Нт(ух) е Нт (х) — 61, Нт (х) + 62 , запись ух попала бы в Лт[Нт(х)] или Лт[ Нт (х) — 81 ] или Лт[ Нт (х) + 62 ], что невозможно из-за нашего

предположения, либо в пассивные вершины между Лт[Лт(х)] и Лm[ ^ (х) — ^ ] или Лт[Лт(х)] и Лm[ Нт (х) + 82 ], а это невозможно по определению пассивных вершин.

Разобьём рассмотрение условия (3) на два случая и покажем ошибочность изначального предположения в обоих.

1. Ьт(ух)е 0,Нт(х) — б! —1. Рассмотрим произвольный у* еУ, такой что Ьт(У*) = Ьт(х) — б1. Хотя бы одна такая запись точно существует в силу того, что Лт[ Нт (х) — б1 ] активная вершина по построению. Относительно у* очевидно неравенство

Ьт(уХ) < М У* ) < Ьт(х).

Тогда в силу монотонности Ит(.) получим

*

Ух < у < X,

что противоречит нашему предположению о том, что ух - ближайшая запись к искомому объекту х.

2. Ит(ух)е Нт (х) + б2 +1, т . Рассмотрим произвольный у * еУ, такой, что Нт(у*) = Нт(х) + б2. Хотя бы одна такая запись точно существует в силу того, что Лт[(х) + б2] активная вершина по построению. Относительно у* очевидно неравенство

Ит(х) < Ит( у* ) < Ит(Ух).

Тогда в силу монотонности Ит(.) получим

*

х< у* < ух,

что противоречит нашему предположению о том, что ух - ближайшая запись к искомому объекту х.

Из рассмотренных случаев, очевидно, что при выполнении условия (3) неизбежно получаем противоречие, а значит наше предположение неверно. Утверждение доказано.

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

• к - математическое ожидание количества коллизий в одном элементе массива;

• I - средняя длина непрерывной последовательности пустых вершин;

• с - число элементов в искомом интервале;

• тк - математическое ожидание числа элементов хеш-таблицы, использующейся для

разрешения коллизий.

Легко заметить, что методы линейного зондирования и двойного хеширования не очень подходят для решения задачи о близости, так как записи каждого коллизионного домена могут оказаться в любом элементе Лт. Вследствие этого, поиск ближайшего элемента можно осуществить лишь полным обходом массива Лт за О(т), что хуже, чем поиск по линейному списку записей за О(п), так как для хеш-таблиц с рассматриваемыми алгоритмами разрешения коллизий п<т.

Аналогично дело обстоит и с интервальным поиском, который можно осуществить лишь полным обходом Лт. Средний и худший случаи решения задачи о близости в данном случае совпадают.

В случаях разрешения коллизий методами линейного зондирования и двойного хеширования все п записей хранятся в массиве Лт. Отсюда легко оценить перерасход памяти как О(т-п).

В научной литературе [39] отмечается, что «при вполне обоснованных допущениях математическое ожидание поиска элемента в хеш-таблице составляет О(1)». В данном случае, под «вполне обоснованными допущениями» понимается эффективность кт и величина

массива m. Как уже отмечалось ранее, не выбор hm, не величина массива Am в рамках данной работы не рассматривается. Потому и сравнение хеш-таблиц по среднему времени поиска идентичного объекта проводиться не будет, так как оно зависит лишь от выбора т и hm.

Рассмотрим теперь эффективность работы хеш-таблиц, которые используют обобщения индексных массивов, позволяющие добавлять в одну и ту же ячейку массива Am несколько записей, благодаря тому, что за этой самой ячейкой скрывается другая структура данных. Назовём эту структуру вспомогательной и введём для её оценки величину T(k), которая определяет сложность разрешения задачи о близости в соответствующей структуре. Так, при использовании метода цепочек переполнения вспомогательной структурой является неупорядоченный список и T(k) = O(k). Если же в качестве такой структуры выбрано бинарное дерево, то T(k) = 0(log(k)).

Решение задач о близости для рассматриваемых хеш-таблиц в силу доказанного утверждения равносильно получению трёх ячеек: основной за 0(1), соседних активных ячеек, путём обхода Am за 0(1); и решению для каждой из полученных ячеек задачи о близости за T(k). Таким образом, оценим сложность решения задачи о близости как 0(l) + T(k).

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

c c

но —. Тогда, для решения задачи интервального поиска необходимо обойти — • l ячеек Am и к к

С 1

— коллизионных домена из k элементов.

к

Таким образом, оценка сложности решения задачи интервального поиска (T) для хеш-таблиц, которые используют обобщения индексных массивов, позволяющие добавлять в одну и ту же ячейку массива Am несколько записей, имеет вид

T = 0(1) + T (к) + ^ С • I j + о^ С • tk j,

где tj. - сложность обхода коллизионного домена из k элементов при заданном методе разрешения коллизий, или

T = 0

Так как в случае исследуемой группы методов разрешения коллизий - все элементы коллизионного домена хранятся в отдельных структурах данных, лишнюю память оценим как общее число вершин за вычетом активных вершин, то есть объём неиспользуемой памяти оценивается как O^m -П j. А в случае, когда дополнительная структура представляет собой хеш-таблицу, тратится ещё больше памяти, так как каждая дополнительная хеш-таблица имеет пустые ячейки. В среднем каждая вспомогательная хеш-таблица имеет тк — к незаня-

n

тых ячеек, в то время как общее число вспомогательных хеш-таблиц оценивается как —. С

к

учётом ячеек, оставшихся свободными в основной таблице, оценка неиспользуемой памяти принимает вид: 0^ т — П + (тк — к )•П j.

Однако, приняв во внимание то, что (тк — к) в среднем не может быть меньше 1, но и асимптотически больше k. Это означает, что асимптотическая оценка объёма неиспользуемой памяти корректно оценить как O(m).

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

Таблица 1

Метод разрешения коллизии Средняя сложность решения Средний перерасход памяти

Задача о близости Интервальный поиск

Линейное зондирование ü

Двойное хеширование ü

Цепочки переполнения Ü

Бинарные Деревья ü

Вторичные хеш-таблицы ü

Предлагаемая структура данных для хеш-таблицы

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

а = <к Уи, Г>,

где 4 и ги - указатели; уи - запись - элемент множества У.

Так как указатели позволяют реализовать связи между узлами структуры данных, образуя, по сути, некоторый граф, будем в дальнейшем называть узлы вида (5) вершинами.

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

Рис. 1. Условные обозначения вершин разных видов

Базовую активную вершину at назовём индексной, если ¡t = NULL - специальное значение, которое свидетельствует о том, что в указателе не содержится адреса объекта, то есть

¡1 ни на что не указывает. В противном случае базовую активную вершину а1 назовём списочной. Списочная вершина представляет собой первый элемент циклического двусвязного списка. В предлагаемой структуре данных списочные вершины будут пересечениями циклических двусвязных списков и индексного массива Ат.

Для удобства представления предлагаемой структуры данных в виде графа введём некоторые обозначения. На рис. 1 изображены условные обозначения разных видов вершин.

Пусть аI - некоторая активная вершина, а aj - соседняя справа активная вершина. Вершину а^ и все пассивные вершины Ат, расположенные между а^ и aj назовём подмасси-вом вершины аг-. Возможно, что две активные вершины расположены непосредственно рядом друг с другом. Тогда считаем что подмассив левой активной вершины пустой. Пример пустого и непустого подмассивов изображены на рис. 2.

А т

...ОтаО^О...

подмассив ai пустой подмассив

активной вершины (3;+^

Рис. 2. Виды подмассивов

В качестве базовой структуры для хеш-таблицы в данной работе предлагается граф с вершинами, представленными на рис. 1 и обладающий следующими свойствами:

• любая пассивная вершина а^ с помощью ¡1 указывает на ближайшую левую активную, а с помощью г на ближайшую правую активную;

• в случае отсутствия коллизий дополнительные вершины в структуре данных отсутствуют, все пассивные вершины - пустые, активные - индексные и с помощью г указывают на самих себя;

• в случае возникновения коллизий, происходят изменения на основании алгоритма А, который будет рассмотрен в данной работе далее.

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

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

Пример предлагаемой структуры данных до появления коллизий представлен на рис. 3.

Рис. 3. Пример предлагаемой структуры данных до появления коллизий

Для удобства визуализации предлагаемой структуры посредствам графов указатели ¡t произвольной базовой вершины at будут формализованы стрелками, располагающимися над последовательностью вершин Am, а указатели rt стрелками, находящимися под ней.

Рассмотрим вспомогательную процедуру, которая по индексу вершины определяет её тип. Пусть стоит задача найти тип некоторой вершины at = <lt, yt, r>. Представим алгоритм данной процедуры.

Шаг 1. Проверить содержит ли ¡t константу NULL. Если содержит, то at - индексная вершина и конец алгоритма.

Шаг 2. Проверить указывает ли ¡t на базовый элемент. Если указывает, то at - пассивная вершина. В противном случае at - списочная вершина. Конец алгоритма..

Для удобства назовём процедуру определения типа вершины на основе рассмотренного алгоритма H.

Отметим, что процедуры H достаточно для определения пустой вершины. Действительно, пустая вершина по определению является пассивной и не содержит записи. С помощью процедуры H определяем, что вершина пассивная и проверяем: есть ли в ней запись. На практике хеш-таблицы реализуются таким образом, что всегда можно определить, содержит ли вершина запись. Это может быть реализовано с помощью специальной зарезервированной записи, означающей отсутствие настоящей, либо использованием в качестве yt указателей или ссылок.

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

В дальнейшем для простоты будет указано, что при необходимости определения типа вершины в различных алгоритмах будет использоваться процедура H. Вместе с тем, очевидно, что до внесения каких-либо изменений в отношении любой вершины процедура H должна быть применена единожды. В рамках парадигмы объектно-ориентированного программирования это реализуется крайне просто. Рассматриваемая процедура реализована в виде метода итератора, который кэширует полученное значение и при повторном вызове не проводит аналогичные действия, а просто возвращает ранее сохранённый тип вершины.

©

/

б)

Рис. 4. Добавление нового элемента в структуру данных, не вызывающее коллизию:

а - изначальный вид, необходимо добавить х в аи; б - вид после добавления, жирными линиями выделены новые связи

Рассмотрим процесс добавления записи в вершину в случае отсутствия коллизии. Очевидно, что не вызвать коллизию может только добавление в пустую вершину. Данный процесс представлен на рис. 4.

Изменение структуры графа, представленное на рис. 4, с алгоритмической точки зрения тривиально и имеет асимптотическую сложность O(l). Действительно, пустая вершина является пассивной, а значит, согласно свойствам исследуемого графа, содержит в себе указатели на ближайшие левую и правую активные вершины. А для представленного на рис. 4 изменения структуры графа достаточно пройти по массиву между двумя этими активными вершинами и соответствующим образом поменять связи. Средняя асимптотическая сложность вытекает из средней величины массива между двумя активными вершинами, которая ранее была обозначена l.

Алгоритмы разрешения коллизий на предлагаемой структуре данных

Рассмотрим теперь задачу разрешения коллизий на предлагаемой структуре данных. В общем виде алгоритм разрешения коллизий A, заявленный в свойствах рассматриваемого графа, состоит из двух вспомогательных алгоритмов: Aj и A2. Алгоритм Aj используется для разрешения коллизий при попадании новой записи в активную вершину, а алгоритм A2 решает аналогичную задачу, при попадании новой записи в заполненную вершину. Алгоритм A заключается в процедуре H и запуске алгоритма Aj, если по итогам H выяснилось, что вершина активная (индексная или списочная), либо запуске алгоритма A2, если вершина пассивная.

На данном этапе рассмотрения предлагаемой структуры данных может сложиться неверное мнение, что для неё множества пустых и пассивных вершин совпадает. На самом деле заполненные пассивные вершины появляются в результате коллизий на активных вершинах. Появление заполненных пассивных вершин, в свою очередь, приводит к появлению на них коллизий. Поэтому целесообразно рассмотреть сначала разрешение коллизий на активных вершинах (алгоритм Aj), а уже потом исследовать аналогичные алгоритмы на пассивных вершинах (алгоритм A2).

Для начала наглядно представим алгоритм разрешения коллизий Aj. На рис. 5 представлены различные случаи разрешения коллизий в предлагаемом графе с помощью алгоритма Aj. Для предотвращения загромождения иллюстрации лишними построениями показаны связи только активных вершин.

Формализуем строго алгоритм Aj. Пусть ai - активная вершина, в которую по результатам работы хеш-функции необходимо поместить некоторый объект х. Рассмотрим алгоритм Aj по разрешению коллизии в вершине ai.

Шаг 1. Если подмассив aj не содержит пустые вершины перейти к шагу 3.

Шаг 2. Добавить х в подмассив ai с сохранением порядка элементов в нём. В качестве новой вершины взять первую пустую, следующую за непустыми вершинами подмассива. Сдвинуть в Am указатель ri на одну вершину вправо, если ai -индексная вершина. Конец алгоритма.

Шаг 3. Присвоить значение последней вершины подмассива ai в переменную у. Если х>у, то поменять их местами. Пометить последнюю вершину подмассива ai как пустую. Сдвинуть в Am указатель ri на одну вершину влево, если ai - индексная вершина.

Шаг 4. Если вершина ai индексная, то преобразовать её в списочную.

Шаг 5. Добавить у в циклический список при списочной вершине ai, с сохранением упорядоченности элементов списка и перейти к шагу 2.

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

Рис. 5. Примеры разрешения коллизий с помощью алгоритма А]

По итогам рассмотрения А1 становится понятным, что предлагаемая структура данных представляет собой индексный массив, пересекающийся в списочных вершинах с циклическим двунаправленным списком.

Рассмотрим подробнее алгоритм Aj, пояснив, возможно неочевидные, операции и проведя оценку его асимптотической сложности.

Пусть üj - ближайшая справа к aj активная вершина. Рассмотрим вспомогательное утверждение о том, что зная üj легко найти и üj (здесь и далее под понятиями «знать вершину» и «найти вершину» будут пониматься соответствующие операции с её адресом). Действительно, для этого достаточно применить процедуру H к стоящей в Am справа от üj вершине. Если эта вершина активная, то она и есть üj, в противном случае данная вершина является пассивной, а, значит, её правый указатель rj+1 содержит адрес üj.

На шаге 1 осуществляется проверка наличия непустых вершин в подмассиве йг-. Из алгоритма A j следует, что, если вершина üj индексная, то rj - её правый указатель - содержит адрес последней заполненной вершины подмассива aj. Поэтому достаточно проверить следующую вершину в Am за последней заполненной. Если эта вершина üj, то подмассив aj не содержит пустых элементов. В том случае, если aj - списочная вершина, то также очевидно, что её подмассив не содержит пустых элементов. Заметим, что процедура H, поиск ближайшей справа активной вершины и все операции шага 1 происходят за константное время.

На шаге 2 производится операция добавления элемента в упорядоченный массив с сохранением порядка. Примем среднее количество заполненных вершин в подмассиве p, тогда асимптотическая сложность данной операции равна O(p). Отметим, что p < l.

Все операции шага 3 стандартны и выполняются за константное время. Тем не менее, может показаться неочевидным то, что известна последняя вершина подмассива вершины aj. Вместе с тем, переход к шагу 3 осуществляется, только если в подмассиве нет пустых ячеек. А это значит, что последняя ячейка подмассива вершины aj находится слева в Am от вершины üj.

Шаги 4 и 5 содержат единственную операцию с неконстантной асимптотической сложностью - добавление элемента в упорядоченный список с сохранением порядка. Если положить среднюю длину списка s, то такая операция асимптотически оценивается как O(s).

На основе проведённого анализа алгоритма Аj, легко видеть, что в нём присутствуют только две операции, осуществляемые за неконстантное время. Это добавление элемента в список, имеющее сложность ü(s) и добавление элемента в массив со сложностью ü(p). Таким образом, асимптотическая сложность рассматриваемого алгоритма (тл ) имеет вид: TAl = ü(p) + ü(s) = ü(p + s) = ü(k).

Рассмотрим второй алгоритм разрешения коллизий - A2, используемый, в случае если коллизия возникла в пассивной заполненной вершине.

Пусть aj - пассивная заполненная вершина, в которую по результатам работы хеш-функции необходимо поместить некоторый объект х. Отметим, что aj входит в подмассив ближайшей левой активной вершины üieft. Данный подмассив ограничен ближайшей активной вершиной справа как к aj, так и к üieft. Назовём эту вершину arjght. Согласно второму свойству предлагаемой структуры данных именно на üieft и arjght. указывают lj и rj соответственно. Ранее мы показали, как, зная üf и йп-^,найти первую пустую вершину или показать, что таковых, в исследуемом подмассиве, нет. Нахождение первой пустой вершины, означает нахождение последней заполненной, так как она, по факту, является предыдущей. Назовём последнюю заполненную вершину рассматриваемого подмассива aend. Так как aleft, ürjght и aend е Am и наименования left, right и end до сих пор были связаны только с семантикой и никак не привязаны к месторасположению вершин, положим без ограничения общности, что üieft = Am[left], ürjght = Am[right] и üend = Am[end].

Рассмотрим алгоритм A2 по разрешению коллизии в вершине aj.

Шаг 1. Находим left, right и end.

Шаг 2. Создаём связный список tmp вершин вида (5) из end - left + 1 элементов.

Шаг 3. Проходим параллельно массив Am, начиная с Am[left] и заканчивая Am[end], и список tmp, присваивая соответствующий элемент массива списку и помечая элементы массива как пустые.

Шаг 4. Если вершина а¡ф индексная, то преобразовать её в списочную.

Шаг 5. Вставить тр в циклический двусвязный список при вершине аф.

Шаг 6. Провести процедуру вставки объекта х без возникновения коллизии. Конец алгоритма.

На рис. 6 изображён пример разрешения коллизий в предлагаемой структуре данных с помощью алгоритма А2. Для предотвращения загромождения иллюстрации лишними построениями показаны связи только активных вершин.

Заметим, что асимптотическая сложность всех операций кроме шагов 3 и 6 0(1). Так, значения вершин списка тр после копирования их из массива упорядочены и наибольшая из них меньше наименьшего значения в циклическом списке при Щф если такой существовал.

NULL

NULL

Шаги А2: 1,2, 3

NULL

NULL 23

Шаги А2: 4, 5, 6

NULL

NULL

NULL

NULL

NULL

NULL

Ш (23)0 0 0

Рис. 6. Разрешение коллизий на основе алгоритма A2 в случае, когда aieft - индексная вершина

Это неравенство имеет место из-за способа заполнения подмассива и списка при вершине aieft. Поэтому вставка списка tmp в циклический двусвязный список осуществляется путём перераспределения нескольких связей, а значит за константное время.

Асимптотическая сложность выполнения шага 3 равна 0(1), так как, по своей сути, рассматриваемый этап алгоритма представляет собой проход по подмассиву некоторой активной вершины, со средней длиной, равной I.

Заметим, что на рис. 6 изображён пример разрешения коллизий с помощью алгоритма A2 только в случае, когда коллизия произошла в подмассиве индексной вершины. На рис. 7 изображён пример разрешения коллизии с помощью алгоритма A2, при условии, что aif -списочная вершина.

Отметим, что шаг 6 не продемонстрирован на рис. 6 и рис. 7 в силу того, что мы отказались от построения связей пассивных вершин. Вместе с тем, изменения структуры данных на шаге 6 алгоритма A2 продемонстрированы на рис. 4 и оценка асимптотической сложности данной процедуры 0(1).

Таким образом, асимптотическая сложность рассматриваемого алгоритма ) имеет вид: T, = 0(1)+ 0(1)+O(l)+O(l)+O(l)+ O(l) = O(l).

Рис. 7. Разрешение коллизий с помощью алгоритма A2 в случае, когда aieft - списочная вершина

Очевидно, что для оценки асимптотической сложности алгоритма A, представляющего собой выполнение одного из алгоритмов Ai или A2, необходимо определить корреляцию между I и к, а также найти вероятность возникновения коллизии в активной и пассивной вершинах. Это возможно лишь при условии выбора конкретного вида hm, поэтому в данной статье ограничимся оценкой сложности алгоритма разрешения коллизий (TA) в виде T = O(max{ к ,l}).

Решение задач информационного поиска на предлагаемой структуре данных

Рассмотрим алгоритм поиска идентичных объектов на исследуемом графе. Пусть имеем задачу информационного поиска вида (1). К хеш-таблице был послан запрос xgX. Найдём запись y из хеш-таблице, идентичную х.

Шаг 1. Вычисляем i = hm(x). Осуществляем процедуру H для вершины Am[i]. Если Am[i] - пассивная вершина, то искомой записи в таблице нет и конец алгоритма.

Шаг 2. Если вершина Am[i] индексная, то переходим к шагу 5.

Шаг 3. Проверяем: лежит ли x в отрезке, задаваемом первым и последним элементом списка. Если x больше максимального элемента списка, то искомой записи в таблице нет и конец алгоритма, а если меньше минимального, то переходим к шагу 5.

Шаг 4. Производим поиск по двусвязному циклическому списку при вершине Am[i]. В результате объект может быть найден или не найден. Результат считается результатом поиска x в Y. Конец алгоритма.

Шаг 5. Производим поиск по индексному массиву - части состоящей из заполненных элементов подмассива Am[i]. Результат считается результатом поиска x в Y. Конец алгоритма.

Единственные шаги рассматриваемого алгоритма, осуществляющиеся за неконстантное время - это шаги 4 и 5. Заметим, что в результате работы алгоритма выполняется только один из этих шагов. Число вершин циклических двусвязных списков в предлагаемой структуре данных в среднем было обозначено s, тогда асимптотическая сложность шага 5 равна O(s). Среднее количество заполненных вершин в подмассиве было обозначено p, тогда асимптотическая сложность шага 5 равна O(log(p)).

В среднем время поиска на хеш-таблице константно. Это происходит благодаря тому, что при выборе хорошей хеш-функции мощность абсолютного большинства коллизионных доменов равна 1. Это означало бы, что s = 0, а p = k = 1.

Вместе с тем, если сравнить алгоритм поиска в предлагаемой структуре данных с алгоритмами поиска при линейном зондировании, двойном хешировании, цепочками переполнения лишь в случаях возникновения коллизий, то становится ясно, что названные виды хеш-таблиц имеют сложность поиска искомой вершины в коллизионном домене со сложностью как минимум O(k). В то время как предлагаемая структура обеспечивает частично логарифмический поиск по коллизионному домену. Если же разрешение коллизий происходит на основе бинарных деревьев и дополнительных хеш-таблиц, то сложность поиска в коллизионном домене будет логарифмической и константной соответственно. Эти показатели лучше, чем у предлагаемой структуры данных.

Заметим, что вместо циклических двусвязных списков можно использовать бинарные деревья, составленные из тех же узлов вида (5). При таком построении скорость поиска не будет падать ниже логарифмической относительно мощности коллизионного домена. Однако подобная модернизация усложнит процедуру разрешения коллизий в пассивных вершинах. Например, в случае, изображённом на последнем графе (рис. 7), осуществлённая там операция добавления списка была бы гораздо сложнее. Также сложнее были бы операции обхода хеш-таблицы. С другой стороны, замена циклического двусвязного списка на дерево может существенно ускорить все операции поиска, на хранимой в списках части коллизионного домена. В дальнейших работах планируется исследование аналогичных структур данных, использующих вместо циклического двусвязного списка различного рода бинарные деревья. А в данной работе ограничимся тем, что выбор хорошей хеш-функции приведёт к отсутствию слишком длинных списков.

Рассмотрим теперь решение задачи о близости на предлагаемой структуре данных. Пусть имеем задачу информационного поиска вида (1). К хеш-таблице был послан запрос xeX. Требуется найти запись, ближайшую к запросу.

Шаг 1. Вычисляем i = hm(x). Осуществляем процедуру H для вершины Am[i]. Если Am[i] - пассивная вершина, то переходим к шагу 6.

Шаг 2. Если x меньше минимального элемента коллизионного домена Am[i], то переходим к шагу 7. А если x больше максимального элемента коллизионного домена Am[i], то переходим к шагу 8.

Шаг 2. Если вершина Am[i] индексная, то переходим к шагу 4.

Шаг 3. Осуществляем решение задачи о близости на циклическом двусвязном упорядоченном списке при вершине Am[i].

Шаг 4. Осуществляем решение задачи о близости на индексном массиве - части состоящей из заполненных элементов подмассива Am[i].

Шаг 5. Выбираем ближайший элемент к х из полученных в результате шага 3, если он имел место, и шага 4. Он и является решением задачи о близости. Конец алгоритма.

Шаг 6. Находим ближайшие к Am[i] слева и справа активные вершины: Am[left] и Am[right] соответственно. Сравниваем максимальный элемент коллизионного домена Am[left] и минимальный Am[right] по критерию близости с х. Ближайший из них и есть решение поставленной задачи о близости. Конец алгоритма.

Шаг 7. Находим ближайшую слева активную вершину Am[left]. Решением задачи будет ближайший к х элемент из максимального элемента Am[left] и минимального элемента Am[i]. Конец алгоритма.

Шаг 8. Находим ближайшую справа активную вершину Am[right]. Решением задачи будет ближайший к х элемент из минимального элемента Am[right] и максимального элемента Am[i]. Конец алгоритма.

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

Минимальный элемент коллизионного домена всегда содержится в вершине Am[i]. А на максимальный указывает либо её правый указатель ri, если Am[i] - индексная вершина, либо левый li, если Am[i] вершина списочная. Нахождение ближайших слева и справа активных вершин к известной рассматривалось ранее и осуществляется за 0(1). Решение задач о близости на упорядоченных списке и массиве, осуществляемое на 3 -м и 4-м шагах соответственно общеизвестны. Асимптотическая сложность 3 -го и 4-го шагов O(s) и O(log(p)) соответственно.

Опираясь на оценки, представленные в табл. 1, можно утверждать, что решение задачи о близости на предлагаемой структуре обладает меньшей асимптотической сложностью, чем в хеш-таблицах с линейным зондированием, двойным хешированием и цепочками переполнения. Что же касается хеш-таблиц осуществляющих разрешение коллизий путём организации коллизионного домена с помощью бинарных деревьев и дополнительных хеш-таблиц, то на данном этапе исследования можно сказать, что скорости решения задачи о близости сравнимы. Более точное сравнение возможно лишь с учётом характеристик hm и планируется в дальнейших исследованиях.

Решение задачи интервального поиска представляет собой решение двух задач о близости, позволяющих найти границы интервала и проход по записям между левой и правой границами найденного интервала. Отметим, что предлагаемая структура данных позволяет пройти по записям, минуя пустые вершины. Действительно, ранее было показано, что для любой ячейки Am можно за константное время найти левую соседнюю активную вершину, которая связана с упорядоченным списком, если таковой присутствует в её коллизионном домене, и подмассивом, конец непустых ячеек которого также легко найти за константное время. Кроме того, известно:

• для каждой пары соседних активных вершин все элементы коллизионного домена левой меньше элементов коллизионного домена правой;

• все записи, хранящиеся в списке активной вершины больше записей хранящихся в её подмассиве;

• все записи, хранящиеся в списке и в подмассиве активной вершины, упорядочены.

Так как алгоритмы последовательного прохождения индексных массивов и двусвяз-ных списков в обе стороны тривиальны, то и алгоритм обхода интервала в любую сторону очевиден. Если положить асимптотическую сложность решения задачи о близости за T, то та же сложность решения задачи интервального поиска определяется как T + с, где с - мощ-ностная нижняя оценка сложности решения задачи интервального поиска, определяемая количеством записей в искомом интервале. Такое выражение для сложности означает, что понизить её могут лишь ассоциативные массивы с лучшими характеристиками решения задачи о близости.

В сравнении с другими хеш-таблицами, асимптотическая сложность интервального поиска в которых представлена в табл. 1, решение задачи о близости лучше только у ассоциативного массива, использующего для разрешении коллизий дополнительные хеш-таблицы. Вместе с тем, подобный подход приводит к тому, что перечисление всех записей в интервале предполагает не только обход пустых ячеек Am, но и пустых ячеек базовых массивов всех дополнительных хеш-функций, разрешающих коллизии внутри искомого интервала. Кроме того, предполагается, что все дополнительные хеш-функции также обладают свойством монотонности, поэтому при хорошей hm и малых размерах списков в предлагаемой структуре данных, она показывает лучшие показатели на интервальном поиске.

Выводы

В статье предлагается структура данных для использования в качестве базовой при проектировании хеш-таблиц. Эта структура состоит из однотипных элементов вида (5), и представляет собой индексный массив, пересекающийся с двусвязными циклическими списками. При этом элементы самого массива связаны друг с другом и с узлами списков определённым образом.

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

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

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

Если сравнивать по критерию перерасхода памяти, то ситуация обратная.

Наибольший перерасход и соответственно худшие показатели демонстрирует метод разрешения коллизий путём дополнительных хеш-таблиц. Это происходит, так как кроме пустых ячеек в Am появляются пустые ячейки и в дополнительных хеш-таблицах, разрешающих коллизии.

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

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

Лучшими по критериям использования памяти являются хеш-таблицы, использующие такие методы разрешения коллизий, как линейное зондирование и двойное хеширование: они хранят все объекты коллизионного домена в ячейках массива Am, но, как было показано раньше, абсолютно не приспособлены для решения задач о близости и интервального поиска.

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

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

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

Библиографический список

1. Гасанов, Э.Э. Теория хранения и поиска информации / Э.Э. Гасанов, В.Б. Кудрявцев. - М.: ФИЗМАТЛИТ, 2002. - 288 с.

2. ГОСТ по пертинентности и релевантности. Система стандартов по информации, библиотечному и издательскому делу. Поиск и распространение информации. Термины и определения. -Взамен ГОСТ 7.27-80; введ. 31.03.1997. - Минск, 2001. - Режим доступа: http: //www.docload.ru/Basesdoc/6/6316.

3. Ландэ, Д.В. Интернетика: Навигация в сложных сетях: модели и алгоритмы / Д.В. Ландэ,

A.А. Санарский, И.В. Безсуднов. - М.: ЛИБРОКОМ, 2009. - 264 с.

4. Белобродский, А.В. Об одном способе поиска релевантных векторов. / А.В. Белобродский,

B.Н. Решетников // Вопросы оптимизации и управления. - М.: Изд-во Моск. ун-та, 1979. - С. 59-63.

5. Robertson, S.E. Simple, proven approaches to text retrieval / S.E. Robertson, K.S. Jones // Cambridge Technical Report. - 1997. - С. 21-23.

6. Поляков, Д.В. Нечеткий подход к определению пертинентности результатов поиска и выбору оптимального запроса / Ю.Ю. Громов, Д.В. Поляков, О.Г. Иванова, В.Е. Дидрих // Вестник Воронежского института ФСИН России. г. Воронеж. ООО ИПЦ «Научная книга». - 2011. -№2 - С. 49-55.

7. Поляков, Д.В. Использование математического аппарата нечеткой логики для определения пертинентности результатов поиска текстовых сведений / Д.В. Полякови [и др.] // Математические методы и информационно-технические средства: Труды VIII Всероссийской научно-практической конференции, Краснодарский университет МВД России. - 2012. - С. 163.

8. Поляков, Д.В. Построение пертинентного запроса к информационно-поисковой машине на основе математического аппарата нечеткой логики / Д.В. Поляков [и др.] // Математические методы и информационно-технические средства: Труды VIII Всероссийской научно-практической конференции, Краснодарский университет МВД России. - 2012. - С. 167.

9. Поляков, Д.В. Определение пертинентности результатов запроса с ис-пользованием нечеткой логики / Д.В. Поляков [и др.] // Приборы и системы. Управление, контроль, диагностика. -2012. - №3 - С. 29-33.

10. Поляков, Д.В. Формализация информационной потребности с помощью коллокаций на основе теории нечётких множеств для пертинентного поиска текстовых сведений / Д.В. Поляков [и др.] // Информация и безопасность. Воронеж: Издательско-полиграфический центр Воронежского государственного университета. - 2012. - Т. 15. - №2 - С. 213—218.

11. Salton, G. Extended Boolean information retrieval / G. Salton, E. Fox, H. Wu // Communications of the ACM. - 2001. - V. 26. № 4. - С. 35-43.

12. Salton, G. A Vector Space Model for Automatic Indexing / G. Salton, A. Wong, C. Yang. // Communications of the ACM. - 1975. - С. 613-620.

13. Salton, G. Selective Text Traversal / G. Salton, A. Singhal. - Department of Computer Science, Cornell University, Ithaca - 1995. - С. 131-144.

14. Salton, G. Automatic Information Retrieval / G. Salton. - Cornell University. - 1980. - С. 41-54.

15. Ермаков, А.Е. Компьютерная лингвистика и интеллектуальные технологии: труды Международной конференции Диалог'2008 // Автоматизация онтологического инжиниринга извлечения знаний из текста. - М., 2008.

16. Пивоварова, Л.М. Извлечение и классификация терминологических коллокаций на материале лингвистических научных текстов (предварительные наблюдения) / Л.М. Пивоварова, Е.В. Ягунова // Материалы симпозиума "Терминология и знание". - М., 2010.

17. Захаров, В.П. Анализ эффективности статистических методов выявления коллокаций в текстах на русском языке. [Электронный ресурс] / В.П. Захаров, М.В. Хохлова. - Санкт-Петербургский государственный университет, Институт лингвистических исследований РАН, Санкт-Петербург, 2010. - Режим доступа: http://www.dialog-21.ru/dialog2010/materials/ html/22.htm.

18. Савина, А.Н. Исследование коллокаций с помощью экспериментов с информантами / А.Н. Савина, Е.В. Ягунова // Корпусная лингвистика-2011 : труды международной конференции. -СПб.: С.-Петербургский гос. университет, Филологический факультет. - 2011. - С. 1-7.

19. Недошивина, Е.В. Учёт синтаксических связей при поиске коллокаций // Natural Language Processing. - 2008. - С. 1-3.

20. Поляков, Д.В. Формализация информационной потребности с помощью коллокаций на основе теории нечётких множеств для пертинентного поиска текстовых сведений / Д.В. Поляков, [и др.] // Информация и безопасность. Воронеж: Издательско-полиграфический центр Воронежского государственного университета. - 2012. - Т. 15. - №2 - С. 213-218.

21. Поляков, Д.В. Кластеризация текстовых коллекций на основе нечеткого описания коллока-ций / О.Г. Иванова, Д.В. Поляков, А.Ю. Громова, В.Е. Дидрих // Информация и безопасность.

- Воронеж: Издательско-полиграфический центр Воронежского государственного университета. - 2011. - №3 - С. 459-462.

22.Адельсон-Вельский, Г.М. Алгоритм организации информации / Г.М. Адельсон-Вельский, ЕМ. Ландис // ДАН СССР - 1962. - Т. 146. - С. 263-266.

23. Белобродский, А.В. Об одном способе поиска релевантных векторов / А.В. Белобродский, В.Н. Решетников // Вопросы оптимизации и управления. - М.: Изд-во Моск. ун-та, 1979.

- С. 59-63.

24. Ben-Or, M. Lower bounds for algebraic computation trees // Proc. Ibth ACM Annu. Symp. Theory Comput. -1983. - С. 80-86.

25. Ferguson, D.E. Fibonaccian searching // С ACM. - 1960. - V. 3. - С. 648.

26. Yuval, G. Finding nearest neighbours // Inform Processing Lett. - 1976. - V. 5. - С. 63-65.

27. Fredman, M.L. An algorithm for finding best match in logarithmic expected time / M.L. Fredman, J.L. Bentley, R.A. Finkel // ACM Trans. Math. Software. - 1977. - V. 3. - С. 209-226.

28. Fredman, M.L. An algorithm for finding nearest neighbors. / M.L. Fredman, F. Baskett, J. Shustek. // IEEE Trans. Comput. - 1975. - С. 1000-1006.

29. Burkhard, W.A. Some Approaches to best match file searching / W.A Burkhard, R.M. Keller // Commun. Ass. Comput. Mach. - 1973. - V. 16. - С. 230-236.

30. Loftsgaarden, D. A nonparametric density function / D.O. Loftsgaarden C.P. Queensberry. - Ann. Math. Stat. 36, 1965 - С. 1049-1051.

31. Lauter, U. 4-dimensional binary search trees as a means to speed up associative searches in design verification of integrated circuits // Journal of Design Automation and Fault Tolerant Computing, 2

1978. №3. - С. 241-247.

32. Bentley, J.L. Multidimensional binary search trees used for asso- associative searching / J.L. Bentley // Commun. Ass. Comput. Mach. - 1975. - V. 18. - С. 509-517.

33. Bentley, J.L. Data structures for range searching / J.L. Bentley, J.H. Friedman // Comput. Surveys. -

1979. - V. 11.- С. 397-409.

34. Bentley, J.L. Efficient worst-case data structures for range searching / J.L. Bentley, H.A. Maurer // Acta Inform. - 1980. - V. 13. - С. 155-168.

35. Bentley, J.L. A problem in multivariate statistics: Algorithms, data structure and applications / J.L. Bentley, M.I. Shamos // Proc. 15th Allerton Conf. Commun., Contr., Comput. - 1977. — С. 193201.

36. Bentley, J.L. Analysis of range range searching in quad trees / J.L. Bentley, D.F. Stanat // Inform. Processing Lett. - 1975. - V. 3. - С. 170-173.

37. Lee, D.T. Worst case analysis for region and partial region searches in multidimensional binary search trees and bal- ansed quad trees / D.T. Lee, С.К. Wong. // Ada Informatica. - 1977. - V. 9. - С. 23-29.

38. Lee, D.T. Quintari trees: A file structures for multi- multidimensional database system / D.T. Lee,

C.К. Wong // ACM Trans. Database Syst. - 1980. - С. 339-353.

39. Кормен, Т. Алгоритмы: построение и анализ / Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн.-2-е изд. - М.: Вильямс, 2011. - 1290 с.

40. Кузнецов, С.Д. Методы сортировки и поиска / С.Д. Кузнецов. - ИСП РАН, Центр информационных технологий Режим доступа: http://citforum.ru/programming/theory/sorting/sort ing1.shtml.

41. Кнут, Д. Э. Искусство программирования. Т. 1. Основные Алгоритмы / Д. Э. Кнут. - 3-е изд. -М.: Вильямс, 2006. - 720 с.

42. Belazzougui, D. Monotone Minimal Perfect Hashing: Searching a Sorted Table with O(1) Accesses /

D. Belazzougui, P. Boldi, R. Pagh, S. Vigna. -Proceedings of the 20th Annual ACM-SIAM Symposium On Discrete Mathematics (SODA), New York, 2009. ACM Press.

43. Belazzougui, D. Theory and Practise of Monotone Minimal Perfect Hashing / D. Belazzougui, P.Boldi, R. Pagh, S. Vigna. - In Proceedings of the 11th Workshop on Algorithm Engineering and Experiments, ALENEX '09. Society for Industrial and Applied Mathematics, 2009.

44. Drossos, L. 2-D Monotone spatial indexing scheme with optimal update time / L. Drossos, S. Sioutas, K. Tsichlas, K. Ioannou. - WSEAS Int. Conf. on REMOTE SENSING, Venice, Italy, November 2-4. 2005. - Р. 121-125.

45. Поляков, Д.В. Алгоритм поиска идентичных объектов на непрерывном множестве // Методы управления потоками в транспортных системах. - М: Изд-во МАДИ. - 2009, С. 114-121.

46.Яковлев, А.В. Оптимизационная задача построения отображения на адресное пространство для модели хранения данных с константным временем поиска / А.В. Яковлев [и др.]. - Воронеж: Приборы и системы. Управление, контроль, диагностика. 2013. №12. С. 36-41.

47. Поляков, Д.В. К вопросу о построении ассоциативных массивов для высокопроизводительных вычислений / Д.В. Поляков, А.И. Попов, В.А. Батуров // Информационные системы и технологии «ИСТ-2015»: материалы XXI Международной научно-технической конференции

- Нижний Новгород: Издательство Института радиоэлектроники и информационных технологий НГТУ. - 2015. - С. 269-270.

48. Поляков, Д.В. Генератор монотонных хеш-функций для ассоциативного массива / Д.В. Поляков, А.И. Попов // Труды НГТУ им. Р.Е. Алексеева. - Нижний Новгород. - 2015. №2 (109).

- С. 70-82.

Дата поступления в редакцию 22.10.2015

D.V. Polyakov, A.I. Popov, S.A. Duzkryatchenko

DATA STRUCTURES TO CREATE AN ASSOCIATIVE ARRAY BASED

ON MONOTONE HASHING

Tambov state technical university

Purpose: Reducing the complexity of algorithms for solving problems of searching of the nearest object, searching of the interval, by developing of the data structure to create a hash table based on a monotone hash function. Approach: The research is based on set theory, the theory of information retrieval and the theory of algorithms. Findings: The structure of the data to create an associative array based on a monotone hash function and algorithms for this structure are suggested. Besides, provides a comparative analysis of the proposed and existing data structures for hash tables.

Research limitations: The research does not address problem of the choice of hash function, requiring only the its monotony. Also in this article is described the number of future researches, that needed for selection the parameters of the proposed structure and conditions of the re-hashing.

Originality / value: The proposed data structure and algorithms, working with it, show good results in solving problems of searching of the nearest object and searching of the interval, in comparison with other data structures, using in hash tables.

Key words: hash table, hash function, an associative array, the problem of searching for identical objects, the problem of searching of the nearest object, the problem of searching of the interval.