Еще раз, у меня есть проблема, из-за которой я бы хотел сбрить наносекунды. У меня есть небольшой постоянный массив, и я хотел бы найти его, чтобы увидеть, является ли данное число членом *.
Вход : 64-битное число n .
Выходные данные : Истина, если n находится в массиве, ложь, если n нет.
Каковы хорошие методы для быстрого бинарного поиска, учитывая возможность оптимизации для конкретных элементов и их распределения.
Особенности
У меня есть массив с 136 членами (хотя см. Ниже: есть некоторая гибкость) для поиска. Члены не равномерно распределены по диапазону: они объединяются в начало и конец диапазона. Входные числа можно считать выбранными с равномерной вероятностью. Вероятно, стоит воспользоваться этим нарушением.
Вот примерная картина распределения для массива из 136 элементов. Обратите внимание, что только 12 из 136 элементов находятся между 1% и 99% диапазона; баланс ниже 1% или более 99%.
http://math.crg4.com/distribution.png
Я предполагаю, что неправильное прогнозирование ветвления будет самой большой стоимостью любой реализации. Я был бы счастлив оказаться неправым.
Примечания
*
На самом деле, у меня есть два массива. На самом деле, у меня есть выбор, какие массивы использовать: эффективность предполагает, что у первого должно быть, возможно, 10-40 членов, в то время как у второго может быть не более (точно) 136 членов. Моя проблема дает реальную гибкость в выборе размеров, а также ограниченную свободу выбора, какие именно элементы использовать. Если метод работает лучше с определенными размерами или ограничениями, укажите это, потому что я могу его использовать. При прочих равных условиях я бы предпочел, чтобы второй массив был максимально большим. По причинам, не связанным с бинарным поиском, мне может понадобиться уменьшить размер второго массива до <= 135 или <= 66 (это связано с трудностью определения числа <em>input , которое зависит от массива выбран).
Вот один из возможных массивов, если он помогает в тестировании идей. (Это довольно хорошо показывает мою цель ...!) Однако не спешите с необоснованными выводами на основе первых нескольких членов.
0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429, 9320093220751060618, 9999984858389672876, 10259680355300795461, 10358875208395550958, 10396764270768694864, 10411236604793371085, 10416764544494255842, 10418876029572233892, 10419682545105283285, 10419990606626453414, 10420108275656914408, 10420153221227127261, 10420170388907304826, 10420176946377624668, 10420179451108406629, 10420180407830432670, 10420180773265728832, 10420180912849591277, 10420180966165882450, 10420180986530893524, 10420180994309635573, 10420180997280850646, 10420180998415753816, 10420180998849248253, 10420180999014828394, 10420180999078074380, 10420180999102232197, 10420180999111459662, 10420180999114984240, 10420180999116330509, 10420180999116844738, 10420180999117041156, 10420180999117116181, 10420180999117144838, 10420180999117155784, 10420180999117159965, 10420180999117161562, 10420180999117162172, 10420180999117162405, 10420180999117162494, 10420180999117162528, 10420180999117162541, 10420180999117162546, 10420180999117162548
Первоначально я буду запускать программу на Phenom II x4, но оптимизация для других архитектур приветствуется.