Представляем разреженные целые множества?

Что представляет собой хороший способ представлять разреженный набор целых чисел (действительно C-адресов памяти) компактным и быстрым способом. Я уже знаю об очевидных вещах, таких как бит-векторы и кодирование длины. но я хочу нечто гораздо более компактное, чем одно слово для каждого элемента. Мне нужно добавить и удалить элементы и проверить членство. Мне не нужны другие операции набора, например union.

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

Ответы

Ответ 1

Вы имеете в виду массив Judy. Это был проект HP. Я думаю, что они используются в рубине и доступны в c. Очень интересная структура данных. Используя тот факт, что распределения (по крайней мере) выровнены по слову, имеющие отдельные структуры для плотных и разреженных диапазонов.

http://judy.sourceforge.net/index.html

Ответ 2

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

http://en.wikipedia.org/wiki/Bloom_filter

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

Ответ 3

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

Ответ 4

Если вы хотите, чтобы структура была меньше, чем набор данных, вы, вероятно, должны посмотреть на какую-либо структуру дерева. Сделайте каждый уровень в 4-х направлениях ключом дерева от 2 бит, начиная с верхнего конца, и он может достаточно компактно (если указатели имеют какую-либо пространственную локальность). Трюк будет кодировать его достаточно компактно (индексы в массивы узлов? Массив, отображаемый деревом?).