Этот вопрос касается эффективности линейного поиска по сравнению с эффективностью бинарного поиска предварительно отсортированного массива в непрерывной памяти...
У меня есть приложение, написанное на фортране (77! ). Одной из частых операций в моей части кода является поиск индекса в массиве, такого что gx(i) <= xin < gx(i+1)
. В настоящее время я реализовал это как двоичный поиск
-- извините за метки операторов и goto
-- я прокомментировал, какие эквивалентные статусы будут использовать fortran 90...
i=1
ih=nx/2
201 continue !do while (.true.)
if((xin.le.gx(i)).and.(xin.gt.gx(i+1)))then !found what we want
ilow=i+1; ihigh=i
s1=(gx(ihigh)-xin)/(gx(ihigh)-gx(ilow))
s2=1.0-s1
return
endif
if(i.ge.ih)then
goto 202 !exit
endif
if(xin.le.(gx(ih))then !xin is in second half of array
i=ih
ih=nx-(nx-ih)/2
else !xin is in first half of array
i=i+1
ih=i+(ih-i)/2
endif
goto 201 !enddo
Однако сегодня я читал в Википедии о бинарном поиске и наткнулся на это:
Binary search can interact poorly with the memory hierarchy
(i.e. caching), because of its random-access nature. For
in-memory searching, if the span to be searched is small, a
linear search may have superior performance simply because
it exhibits better locality of reference.
Я не совсем понимаю это утверждение — у меня сложилось впечатление, что кэш-выборки собирались большими кусками за раз. , поэтому, если мы начнем с начала массива, я думал, что большая часть массива уже будет в кеше (по крайней мере, столько, сколько было бы для линейного поиска), поэтому я не думал, что это будет иметь значение.
Итак, мой вопрос: есть ли способ определить, какой алгоритм будет работать лучше (линейный или бинарный поиск?) Существует ли граница размера массива? В настоящее время я использую массивы размером около 100 элементов...