这个问题涉及在相邻的存储中针对预排序数组进行线性搜索和二进制搜索的效率比较。
我有一个用Fortran(77!)编写的应用程序。我的代码部分经常需要在数组中查找索引,使得
然而,今天我在维基百科上阅读有关二分查找的内容时,发现了以下信息:
我并不完全理解这个语句——我的印象是缓存获取是一次性收集大块数据的,所以如果我们从数组的开头开始,我认为大部分数组已经在缓存中了(至少对于线性搜索来说是这样),所以我认为这不会有影响。
所以我的问题是,有没有办法判断哪种算法表现更好(线性搜索还是二分搜索?)有一个数组大小的边界吗?我目前正在使用大约100个元素大小的数组...
我有一个用Fortran(77!)编写的应用程序。我的代码部分经常需要在数组中查找索引,使得
gx(i)<= xin <gx(i + 1)
。我目前实现了这个功能为二进制搜索
- 抱歉,使用Fortran 90时语句标签和goto
会略有不同... 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个元素大小的数组...
index=count(gx<=xin)+1
的代码如果元素是短的(int/float),则可能非常快--您可以尝试欺骗f77编译器执行相同的操作。 - laxxy