Поскольку большая часть времени затрачивается на поиск внутри блока, это должно быть как можно быстрее.Поскольку количество элементов фиксировано, вы можете полностью развернуть этот цикл, например:
if (key < a[16]){
if (key < a[8]){
...
}
else { // key >= a[8] && key < a[16]
...
}
}
else { // key >= a[16]
if (key < a[24]){
...
}
else { // key >= a[24]
...
}
}
Изучите сгенерированный язык ассемблера и пошагово его в отладчике, чтобы убедиться, что компилятор дает вам хороший код.
Возможно, вы захотите написать небольшую программу для распечатки приведенного выше кода, так как это будет сложно написать вручную, или, возможно, сгенерировать ее с помощью макросов.9-битный критерий поиска.В этом случае просто предварительно выделите массив из 512 4-байтовых слов и индексируйте его напрямую.Это самый быстрый и наименьший код.
ТАКЖЕ ДОБАВЛЕНО: Если вам нужно сохранить структуру блоков, есть еще один способ выполнить развернутый бинарный поиск.Это метод Джона Бентли:
i = 0;
if (key >= a[i+16]) i += 16;
if (key >= a[i+ 8]) i += 8;
if (key >= a[i+ 4]) i += 4;
if (key >= a[i+ 2]) i += 2;
if (i < 30 && key >= a[i+ 1]) i += 1; // this excludes 31
if (key == a[i]) // then key is found
Это медленнее, чем дерево if, описанное выше, из-за манипулирования i
, но может быть существенно меньше кода.