这个问题是关于线性搜索的效率与对连续存储中预排序数组的二进制搜索的效率...
我有一个用 fortran (77!) 编写的应用程序。我的部分代码的一个常见操作是在数组中查找索引,使得gx(i) <= xin < gx(i+1)
. 我目前已将其实现为binary search
- 对语句标签感到抱歉,并且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
但是,今天,我在 Wikipedia 上阅读有关二分搜索的内容时遇到了这个问题:
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.
我不完全理解这个说法——我的印象是缓存提取是一次以大(ish)块收集的,所以如果我们从数组的开头开始,我认为大部分数组都会在缓存中已经(至少与线性搜索一样多),所以我认为这并不重要。
所以我的问题是,有什么方法可以判断哪种算法性能更好(线性搜索还是二进制搜索?)是否存在数组大小边界?我目前正在使用大小约为 100 个元素的数组...