Веб приложение сравнивает попарно наборы целых положительных чисел.
Каждый набор не содержит внутри себя повторов, любое из чисел не больше 210 млн. (28 бит).
В наборе их может быть от 1 до 5 млн.
Сравнивая наборы A и B надо получить наборы «уникальные для A», «уникальные для B» и «общее ядро». В частности, просто отвечать на вопросы «Есть ли в наборе S число N?»
Реализация, увы, на php и пока на shared hosting. Наскоро реализовал, нагрузив хостинговый MySQL: под каждый сет временная таблица с единственной колонкой-индексом. В большинстве случае таблицы превышают размер, который помещается в engine=Memory, и на дисковых таблицах это совсем небыстро, но работает.
Как эффективно держать такой набор, чтобы сравнение двух сетов выполнялось быстро, занимя минимальный footprint по памяти?
Пришло в голову записать каждый набор битовой маской длиной в 2^28 бит (32Mb). Из 210 млн бит всего 5 млн единиц, остальные 0: их можно записывать числом нулей подряд, например. Очень похоже на велосипед. Подскажите всем, кроме меня, известный алгоритм, эффективный для компрессии бинарных данных в частном случае «много нулей подряд»?
Про
Huffman coding читал, похоже, он будет неэффективен для поиска каждого из 5 млн. чисел второго сета внутри первого.