☞能够掌握求解的算法,并给出详细的执行过程。
☞对于折半搜索二叉树中,若根结点在第1层, 且分枝结点数为= 2& − 1,则外部结点均在第ℎ + 1层。
这同样也是一种利用分治法设计的查找算法——折半查找。
一、基本思想
•在有序表中,取中间记录作为比较对象,
若给定值与中间记录的关键码相等,则查找成功;
若给定值小于中间记录的关键码,则在中间记录的左半区继续查找;
若给定值大于中间记录的关键码,则在中间记录的右半区继续查找。
•不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。
每次取中间元素将查找范围缩小,将时间复杂度降低到了logn级别。
二、算法描述
- low=1;high=n; //设置初始查找区间
- 测试查找区间[low,high]是否存在,若不存在,则查找失败;
- 否则取中间点mid=(low+high)/2; 比较k与r[mid],有以下三种情况:
- 若k<r[mid],则high=mid-1;查找在左半区进行,转2;
- 若k>r[mid],则low=mid+1;查找在右半区进行,转2;
- 若k=r[mid],则查找成功,返回记录在表中位置mid;
public int rank(Key key) //参数key为需要查找的元素
{
int lo = 0, hi = N-1; //初识查找的范围是整个数组
while (lo <= hi)
{
int mid = lo + (hi - lo) / 2;
int cmp = key.compareTo(keys[mid]); //Number下的比较大小方法,返回值以调用者来定
if (cmp < 0) hi = mid - 1; //调用者小于参数,返回-1
else if (cmp > 0) lo = mid + 1; //调用者小于参数,返回1
else return mid;
}
return lo; //如果最后只剩一个元素,说明已经找到
}
三、时间复杂度分析
二分搜索算法在成功搜索的情况下,关键字值之间的比较次数不超过logn+1。对于不成功搜索,算法需要作logn或logn+1次比较。
二分搜索算法在搜索成功时的平均时间复杂度为Θ(logn)。
注:二叉搜索树可参考:yyHaker:二叉搜索树(BinarySearchTree)zhuanlan.zhihu.com
内容有待完善,请各位客官等待更新!