Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Здесь же простой примерПлохой пример.
согласен с автором статьи, что если объем данных большойТо есть бинарный поиск будет быстрее чем i = Math.round(P/ (L / C)), где:
Ещё в статье не рассказано про интерполяционный поиск.
В нем надо строку
const middle = Math.floor((start + (end - start)/2);заменить на
const middle = Math.round(start + (target - data[start].svgX) * (end - start)/ (data[end].svgX - data[start].svgX))Если данные в массиве расположены более менее равномерно, то такой поиск будет эффективнее. В крайнем случае формула вырождается в ту, что привели выше.
Это гениально — сравнивать перебор (сложность O(n)) и бинарный поиск (O(logn)).
Если объем данных небольшой, рекурсия может быть медленнее, чем цикл for. При тестировании на jsperf с 10 элементами, рекурсивная функция в среднем на 3% медленнее, чем цикл for. Однако при количестве элементов в 10 000, цикл for на 72% медленнее, чем рекурсивная функция. Это означает, что рекурсия практически в два раза быстрее, чем цикл for, и это огромная экономия времени!
Голословненько. Где пруфы?
А бинарным поиском без рекурсии, через while слабо? А вместо монстра Math.floor((a+b)/2) битовый сдвиг, видимо, для нердов и никому уже не нужно.
//lib
function bsrc(arr, search){
var toValue = arguments[2] || search.toValue || (f=>f);
search = toValue(search);
for(var x1=0, mid, x2=arr.length; x1 < x2;){
mid = x2+x1-1>>1;
if(toValue(arr[mid]) > search) x2=mid;
else x1=mid+1;
}
return (x1%=arr.length) && toValue(arr[x1-=1])==search ? x1:-1;
}
//prepare 1:
var arr = [3, 24, 32, 35, 38, 45, 46, 49, 52, 52, 69, 71, 75, 77, 78, 89, 89, 90, 96, 99];
//usage 1:
bsrc(arr,35);
//prepare 2:
var arr = [3, 24, 32, 35, 38, 45, 46, 49, 52, 52, 69, 71, 75, 77, 78, 89, 89, 90, 96, 99];
arr.bsrc = bsrc.bind(this,arr);
//usage 2:
arr.bsrc(38);
//prepare 3:
var arr = [{key:8, val:3}, {key:10, val:24}, {key:15, val:32}, {key:21, val:35}, {key:39, val:38}];
arr.bsrc = bsrc.bind(this,arr);
//usage 3:
arr.bsrc({val:32},f=>f.val);
arr.bsrc({key:21},f=>f.key);
Бинарный поиск в JavaScript. Практический пример