Сначала попробуйте хеш-таблицы. Есть несколько вариантов, которые могут выдержать очень плотную без значительного замедления (например, вариации Брента).
Если вам нужно хранить только 32-разрядные целые числа, а не какую-либо связанную запись, используйте set
, а не map
, как hash_set
в большинстве библиотек C ++. Он будет использовать только 4-байтовые записи плюс некоторые постоянные накладные расходы и небольшой провал, чтобы избежать 100%. В худшем случае для обработки «миллионов» чисел потребуется несколько десятков мегабайт. Большой, но ничего неуправляемого.
Если вам нужно, чтобы он был намного теснее, просто сохраните их отсортированными в простом массиве и используйте двоичный поиск для их извлечения. Это будет O (log n) вместо O (1), но для «миллионов» записей это всего лишь два шага, чтобы получить любую из них. В C у вас есть bsearch()
, что так быстро, как может.
edit : только что увидел в своем вопросе, что вы говорите о каких-то «отображенных данных (имя)». эти имена уникальны? они тоже должны быть в памяти? если да, они определенно будут доминировать над требованиями к памяти. Тем не менее, если имена являются типичными английскими словами, большинство из них будет 10 байтов или меньше, сохраняя общий размер в «десятках мегабайт»; может быть, до ста мегабайт, все еще очень управляемым.