Эффективность бинарного поиска и эффективность линейного поиска в фортране

Этот вопрос касается эффективности линейного поиска по сравнению с эффективностью бинарного поиска предварительно отсортированного массива в непрерывной памяти...

У меня есть приложение, написанное на фортране (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 элементов...

8
задан mgilson 9 May 2012 в 21:03
поделиться