Начните с транспонирования вашей структуры данных, т.е. вместо сохранения сопоставления клиентов -> категории (A / B / C) сохраните сопоставление категорий -> клиентов. Я обнаружил, что транспонирование является обычным и классным методом для разработки очень эффективных структур данных.
Теперь используйте 3 битовые карты (битовые маски, битовые наборы, такие как java.util.BitSet
) для каждой из таблиц 3 A, B, C. I-й бит в таблице A сообщит, относится ли номер клиента «i» к категории A.
Каждая из этих таблиц будет занимать только N / 8 байт памяти, что составляет всего 3,75 МБ при 10 млн. Ваших клиентов.
(обратите внимание, что это будет работать только в том случае, если ваши идентификаторы клиентов являются последовательными целыми числами)