Questa domanda riguarda l'efficienza di una ricerca lineare contro l'efficienza di una ricerca binaria per un array pre-ordinato in deposito contiguo ...binario efficienza di ricerca vs. efficienza ricerca lineare in FORTRAN
Ho un applicazione scritta in fortran (77!). Un'operazione frequente per la mia parte del codice è trovare l'indice in una matrice tale che gx(i) <= xin < gx(i+1)
. Ho attualmente implementato questo come un binary search
- dispiace per le etichette istruzione e goto
- Ho commentato quello che i statments equivalenti sarebbero utilizzando 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
Tuttavia, oggi, stavo leggendo su Wikipedia ricerca binaria e mi sono imbattuto in questo:
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.
non capisco completamente questa affermazione - la mia impressione è stata che recupera di cache sono stati raccolti in grandi (ish) pezzi alla volta, quindi se si parte all'inizio dell'array, pensavo che la maggior parte dell'array sarebbe già nella cache (almeno tanto quanto sarebbe per una ricerca lineare), quindi non pensavo che avrebbe avuto importanza.
Quindi la mia domanda è, c'è un modo per dire quale algoritmo funzionerà meglio (ricerca lineare o binaria?) C'è un limite di dimensione dell'array? Attualmente sto usando matrici di dimensioni di circa 100 elementi ...
Grazie per questo. È molto istruttivo. Prendo da "il punto esatto di pareggio da misurare" che non esiste una regola empirica su come gestire queste cose (quando effettuare una ricerca lineare rispetto a una ricerca binaria)? – mgilson
Esattamente. Dipende anche dalla CPU. Per le grandi liste (o molte piccole liste!), Dipende ovviamente dalla dimensione della cache. Avrei appena impostato un micro-benchmark e misurato la ricerca binaria e la ricerca lineare su N elementi. – usr
Anche le moderne MMU tenderanno a prefetch i dati dalla RAM se vedono che accedete a n, n + 1, n + 2 ° elemento in sequenza, ma non potete dire cosa state facendo se vi accedete in uno schema apparentemente casuale come uscite di ricerca binaria. – SecurityMatt