У меня есть очень серьезная проблема для решения. У меня есть список из 75000 слов. Каждому слову присваивается номер для удобства идентификации. Первому слову присваивается 0, последнее слово - 75000. Теперь у меня есть список предложений. Возьмем 1 пример для примера.Алгоритм/формат номера для номеров «меньше хранения»
I have big dog
Когда вы представляете это с присвоенными номерами, он стал 20 123 2332 3434
. Это просто означает, что слово Я появился в 20-слово в нашем списке, слово имеют появился как 123 слова в нашем списке, слово большой появился как 2332 слова и так далее.
Как раз это, у меня более 2 миллиардов предложений, и мне нужно сохранить/написать их численное представление. Мы считали, что сохранение длинных номеров, таких как 20 123 2332 3434
за 2 миллиарда записей, займет огромное пространство. Вместо этого, если мы можем представить их с использованием более короткой системы счисления, например F3x G6e rRr
, это позволит сэкономить место для хранения.
Как я могу это достичь? Может быть, используются шестнадцатеричные числа? Я использовал this конвертер и, кажется, нет большой разницы, потому что число в шестнадцатеричном 1e240 числа в шестнадцатеричной является 124f8 и так далее; похоже, что количество символов одинаково, поэтому я не уверен, сохранит ли оно какое-либо пространство.
Просьба предоставить вам ваши советы для достижения этой задачи. Я буду писать эту функцию в Java.
Как насчет Base64, а затем Deflate? –
@BoristheSpider: Спасибо за ответ. Любая ссылка на разумный источник или что-то вроде этого? –
Сохраняете ли вы список чисел в виде строки или в двоичном формате? Если он находится в двоичном формате, вы можете использовать очень простое соглашение, т. Е. Сериализовать строку как 32-битное целое число, представляющее количество слов, следующих, а затем одно число на слово, сериализованное как 17-битное целое число (log2 (75000) ~ 17). Вы могли бы даже использовать некоторую форму сжатия, если бы знали распределение слов вверх. –