先看无序向量的查找操作:
Rank vector<T>::find(T const & e, Rank lo, Rank hi) //在区间[lo, hi)中寻找值为e且秩为最大者
{
while ((lo < hi--) && (e != _elem[hi])); //逆向寻找秩最大者
return hi; //当hi < lo时意味着查找失败
}
我们看到,对于无序向量,由于元素间的大小关系不确定,所以要想查找符合要求的元素,不论如何都必须将整个向量进行一次遍历,直到找到目标元素为止,这就意味着无序向量的查找操作的复杂度为O(n)。而在处理有序向量时,由于已知元素间的大小关系,所以当我们对向量中的某一个元素做出判断后,就可以确定目标元素是在该元素之前或是之后抑或就是该元素自身,因而不必大费周章的往两端判断,只需取其一端即可。这样一来,整体的算法复杂度就变为了O(logn),相比于无序向量的查找算法,已经有了很大的改进。
现在,我们针对有序向量的特点,采用二分查找策略,其实现如下:
Rank vector<T>::binsearch(T const & e, Rank lo, Rank hi) //在区间[lo, hi)中寻找值为e的元素
{
while (lo < hi)
{
Rank mi = (lo + hi) / 2; //取区间[lo, hi)的中点
if (e &l