(уже просили на главном сайте , но просим также о лучшем освещении, извините)
Так как я знал о сжатых структурах данных, мне отчаянно нужен хороший обзор последних событий в этой области.
Я погуглил и прочитал много статей, которые я мог видеть в верхней части результатов Google по запросам сверху моей головы. Я все еще подозреваю, что пропустил что-то важное здесь.
Вот темы, представляющие особый интерес для меня:
Сжатое кодирование бинарных деревьев с эффективными операциями получения родительского элемента, левого / правого дочернего элемента, количества элементов в поддереве.
Основной вопрос здесь следующий: все известные мне подходы предполагают, что узлы дерева перечисляются в порядке первого дыхания (как в пионерской работе в этой области Jacobson, G. J (1988). Краткие статические структуры данных), которая не кажется подходящим для моей задачи. Я имею дело с огромными бинарными деревьями, приведенными в макете с глубиной вначале, и индексы узла в глубину являются ключами к другим свойствам узла, поэтому изменение схемы дерева имеет для меня определенную стоимость, которую я хотел бы минимизировать. Отсюда и интерес к получению ссылок на работы с учетом других, чем макетов дерева BF.
Большие массивы элементов переменной длины во внешней памяти. Массивы неизменны: мне не нужно добавлять / удалять / редактировать элементы. Единственное требование - время доступа к элементу O (1) и минимальные издержки, насколько это возможно, лучше, чем прямой подход смещения и размера. Вот некоторая статистика, которую я собрал о типичных данных для моей задачи:
типичное количество предметов - сотни миллионов, до десятков миллиардов;
около 30% элементов имеют длину не более 1 бита ;
40% -60% элементов имеют длину менее 8 бит;
только несколько процентов элементов имеют длину от 32 до 255 бит (ограничение 255 бит)
средняя длина элемента ~ 4 бита +/- 1 бит.
любое другое распределение длин предметов теоретически возможно, но все практически интересные случаи имеют статистику, близкую к описанной выше.
Ссылки на статьи любой сложности, учебные пособия любой неясности, более или менее документированные библиотеки C / C ++, - все, что было полезно для вас в подобных задачах или что выглядело так по вашему образованному предположению - все такие вещи с благодарностью приветствуются.
Обновление : я забыл добавить к вопросу 1: двоичные деревья, с которыми я имею дело, неизменны. У меня нет требований для их изменения, все, что мне нужно, это только обходить их различными способами, всегда переходя от узла к дочернему элементу или к родительскому элементу, чтобы средняя стоимость таких операций составляла O (1).
Кроме того, типичное дерево имеет миллиард узлов и не должно полностью храниться в оперативной памяти.