Нужен хороший обзор для алгоритмов сжатой структуры данных

14

(уже просили на главном сайте , но просим также о лучшем освещении, извините)

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

Я погуглил и прочитал много статей, которые я мог видеть в верхней части результатов Google по запросам сверху моей головы. Я все еще подозреваю, что пропустил что-то важное здесь.

Вот темы, представляющие особый интерес для меня:

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

    Основной вопрос здесь следующий: все известные мне подходы предполагают, что узлы дерева перечисляются в порядке первого дыхания (как в пионерской работе в этой области Jacobson, G. J (1988). Краткие статические структуры данных), которая не кажется подходящим для моей задачи. Я имею дело с огромными бинарными деревьями, приведенными в макете с глубиной вначале, и индексы узла в глубину являются ключами к другим свойствам узла, поэтому изменение схемы дерева имеет для меня определенную стоимость, которую я хотел бы минимизировать. Отсюда и интерес к получению ссылок на работы с учетом других, чем макетов дерева BF.

  2. Большие массивы элементов переменной длины во внешней памяти. Массивы неизменны: мне не нужно добавлять / удалять / редактировать элементы. Единственное требование - время доступа к элементу O (1) и минимальные издержки, насколько это возможно, лучше, чем прямой подход смещения и размера. Вот некоторая статистика, которую я собрал о типичных данных для моей задачи:

    типичное количество предметов - сотни миллионов, до десятков миллиардов;

    около 30% элементов имеют длину не более 1 бита ;

    40% -60% элементов имеют длину менее 8 бит;

    только несколько процентов элементов имеют длину от 32 до 255 бит (ограничение 255 бит)

    средняя длина элемента ~ 4 бита +/- 1 бит.

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

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

Обновление : я забыл добавить к вопросу 1: двоичные деревья, с которыми я имею дело, неизменны. У меня нет требований для их изменения, все, что мне нужно, это только обходить их различными способами, всегда переходя от узла к дочернему элементу или к родительскому элементу, чтобы средняя стоимость таких операций составляла O (1).

Кроме того, типичное дерево имеет миллиард узлов и не должно полностью храниться в оперативной памяти.

datjko
источник

Ответы:

12

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

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

γδВВ

NSNS[я]знак равно1яJрaNК(J)

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

Джуни Сирен
источник