Существует несколько структур данных, которые обеспечивают доступ O (1) в Erlang: таблицы ETS, кортежи и двоичные файлы.
Теперь ни один из них не подходит для бинарного поиска. Таблица ETS поддерживает поиск с самого начала, в противном случае данные копируются в ваш процесс при возврате результата, что, вероятно, не будет оптимальным для вашего варианта использования.
Кортежи разрешают O (1) доступ с element/2
, но их изменение имеет определенные издержки (именно поэтому модуль массива использует деревья кортежей).
Тогда у вас есть двоичные файлы (<<1,2,3,4,5>>
), которые допускают нечто похожее на арифметику указателей, как в следующем примере:
1> Sorted = <<$a,$b,$c,$d,$e,$f,$g,$h>>.
<<"abcdefgh">>
2> <<_:3/binary, X:1/binary, _/binary>> = Sorted.
<<"abcdefgh">>
3> X.
<<"d">>
Однако прогнозировать производительность при построении двоичного файла немного схематично, и этот вид арифметики с указателями сложнее сделать, если ваши значения имеют разные типы и разные размеры при представлении в двоичном формате.
Лучше всего будет использовать список значений, отсортировать его, а затем использовать list_to_tuple/1
для перемещения по нему с помощью element/2
.
Однако я настоятельно рекомендую использовать дерево для поиска; Скорее всего, было бы намного проще использовать модуль gb_tree
для построения сбалансированного дерева и все еще получать O (log N) поиск.