Веб-приложение сравнивает пары множеств положительных целых чисел. Каждый набор имеет только уникальные значения, не более 210 000 000 (подходит для 28 бит). До 5 000 000 значений в каждом наборе.Как сжать набор уникальных натуральных чисел и сравнить два таких набора?
Сравнивая комплекты A & B, необходимо три набора результатов: «уникально для A», «уникально для B», «общий для A & B». Особая задача - ответить на вопрос «есть ли число N в наборе S?»
Пока проект работает в ограниченных ресурсах общего хостинга под стеком LAMP. Решение Quick'n'dirty, с которым я столкнулся, заключалось в том, чтобы передать работу на хостинг MySQL, у которого больше ресурсов. Временная таблица для каждого набора, единственным столбцом с номерами является основной индекс. Редкие наборы достаточно малы, чтобы вписаться в двигатель = Память, которая быстрая. Он работает, но слишком медленный.
Ищет способ сохранить такой набор в памяти, который эффективен для поиска определенного номера внутри. Следите за тем, чтобы пространство памяти было как можно меньше.
Я пришел к идее кодирования каждого набора в виде битовой маски из 2^28 бит (32 Мб). Число, присутствующее в наборе = 1 бит. 5 млн. Номеров = 5 млн. Бит, из которых 210 млн. Многие нули == могут эффективно сжиматься?
Похоже, я изобретаю велосипед. Пожалуйста, направьте меня к «хорошо известному» решению этого конкретного случая двоичного сжатия. Я читал о кодировании Хаффмана, что кажется неправильным решением, поскольку основное внимание уделяется уменьшению размера, в то время как моя задача требует много поисков по сжатому набору.
Обновление. Просто нашел статью о Golomb coding и пример ее application to run-length encooding.
210 000 000 требуется 28 бит; 2^23 - чуть более восьми миллионов. – rici
@rici: Вы правы, исправлены. 23 был из оптимизации, которую я рассматривал atm:) – Serge