有序向量的三种查找方式

1 二分查找(版本A)

在有序向量的区间[lo,hi)内查找元素e.

template <typename T> static Rank binsearch(T *A,T const& e,Rank lo,Rank hi){

 while(lo<hi){

Rank mi=(lo+hi)>>1;

if(e<A[mi])  hi=mi;

else if(e>A[mi])  lo=mi+1;

else  return mi;

}

return -1;  //查找失败

}  //  有多个命中元素时,不能保证返回秩最大者;查找失败时,简单的返回-1,而不能指示失败的位置。

时间复杂度O(log{_{2}}^{n})

 

2 Fibonacci查找

在[lo,hi),中查找元素e

template <typename T> static Rank fibsearch(T *A,T const & e,Rank lo,Rank hi){

Fib fib(hi-lo);  //用O(long_phi(n=hi-lo)时间创建fib数列

while(lo<hi){

while(hi-lo<fib.get() ) fib.prev();

Rank mi=lo+fib.get()-1;  //确定形如Fib(k)-1的轴点

if (e<A[mi]) hi=mi;

else if(A[mi]<e) lo=mi+1;

else return mi;

}

时间复杂度O(log{_{2}}^{n})

 

3 二分查找(版本B)

template <typename T> static Rank binSearch(T* A, T const& e,Rank lo,Rank hi){

while(1<hi-lo){//每步迭代仅需做一次比较判断,有两个分支;成功查找不能提前终止

Rank mi=(lo+hi)>>1;

(e<A[mi])?hi=mi:lo=mi; //经比较后确定深入[lo,mi)或[mi,hi)

}

return (e==A[lo])?lo:-1;

}//有多个命中元素时,不能保证返回秩最大者;查找失败时,简单地返回-1,而不能指示失败的位置

时间复杂度为O(logn)

 

4 二分查找(版本C)

template<typename T> static Rank binSearch(T* A,T const& e,Rank lo,Rank hi){

while(lo<hi){

Rank mi=(lo+hi)>>1;

(e<A[mi])?hi=mi:lo=mi+1; //深入[lo,mi)或[mi+1,hi)

}//成功查找不能提前退出

return --lo;//循环结束时,lo为大于e的元素的最小秩,故lo-1即不大于e元素的最大秩

}//有多个命中元素时,总能保证返回秩最大者;查找失败时,能够返回失败的位置

时间复杂度为O(logn)

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值