Дайте мне посмотреть, смогу ли я переформулировать ваше требование. Это похоже на наличие, скажем, дня года и желание знать, в каком месяце выпадает данный день? Итак, учитывая год с 600 000 дней (интересная планета), вы хотите вернуть строку «Jan», «Feb», «Mar» ... «Dec»?
Позвольте мне сначала сосредоточиться на конце поиска, и я думаю, что вы можете выяснить, как упорядочить данные при инициализации структур данных, учитывая то, что уже было опубликовано выше.
Создать структуру данных ...
typedef struct {
int DayOfYear :20; // an bit-int donating some bits for other uses
int MonthSS :4; // subscript to select months
int Unused :8; // can be used to make MonthSS 12 bits
} BUCKET_LIST;
char MonthStr[12] = "Jan","Feb","Mar"... "Dec";
.
Чтобы инициализировать, используйте цикл for {}, чтобы установить BUCKET_LIST.MonthSS на один из 12 месяцев в MonthStr.
При получении выполните бинарный поиск по вектору BUCKET_LIST.DayOfYear (вам нужно написать тривиальную функцию сравнения для BUCKET_LIST.DayOfYear). Ваш результат может быть получен при использовании возврата из bsearch () в качестве индекса в MonthStr ...
pBucket = (BUCKET_LIST *)bsearch( v_bucket_list);
MonthString = MonthStr[pBucket->MonthSS];
Общий подход здесь состоит в том, чтобы иметь наборы «указателей» на строки, прикрепленные к 600 000 записей. Все указатели в ведре указывают на одну и ту же строку. Я использовал бит int в качестве нижнего индекса здесь вместо 600k 4-байтовых указателей, потому что он занимает меньше памяти (4 бита против 4-х байтов), а BUCKET_LIST сортирует и ищет как разновидность int.
Используя эту схему, вы будете использовать не больше памяти или хранилища, чем для хранения простого ключа int, получить ту же производительность, что и простой ключ int, и покончить со всей проверкой диапазона при получении. IE : нет, если {} тестирование. Сохраните эти if {} для инициализации структуры данных BUCKET_LIST, а затем забудьте о них при извлечении.
Я называю этот метод псевдонимом индекса, так как он разрешает отношение многие-к-одному путем преобразования индекса многих в индекс одного индекса - очень эффективно, я мог бы добавить.
Мое приложение состояло в том, чтобы использовать массив из множества UCHAR, чтобы индексировать массив меньших чисел с плавающей точкой. Уменьшения размера было достаточно, чтобы сохранить все данные «горячей точки» в кэше L1 на процессоре. Увеличение производительности в 3 раза только из-за этого небольшого изменения.