一、Binary Search的思想及实现:
以有序表表示静态查找表时,查找函数可以用二分查找来实现。
二分查找(Binary Search)的查找过程是:先确定待查记录所在的区间,然后逐步缩小区间直到找到或找不到该记录为止。
假设 low 指向区间下界,high 指向区间上界,mid 指向区间的中间位置,则 mid = (low + high) / 2;
具体过程:
1.先将关键字与 mid 指向的元素比较,如果相等则返回mid。
2.关键字小于 mid 指向的元素关键字,则在 [ low, mid-1 ]区间中继续进行二分查找。
3.关键字大于mid 指向的元素关键字,则在[ mid +1 , high] 区间中继续进行二分查找。
代码如下:
//二分查找返回待查元素的数组下标 int search_Binary(STable st, KeyType key){ int low = 0; int high = st.length - 1; while(low <= high){ int mid = (low + high)/2; if( key == st.elem[mid].key) return mid; else if(key < st.elem[mid].key) high = mid - 1; else low = mid + 1; } return 0; }
二、性能分析:
二分查找的查找过程可以用二叉树来描述,树种每一个节点表示查找表中的一个元素,这个描述查找过程的二叉树叫做判定树。每一次查找过程就走了一条从判定树的根节点到与该元素相应节点的路径,和给定值进行比较的关键字个数恰好是该节点在判定树上的层次数。因此二分查找在查找成功时进行比较的关键字个数最多不超过判定树的深度,而具有n个节点的判定树的深度为:,所以二分查找成功时最多进行了
次比较。
同样的,查找不成功时无非就是沿着判定树从根节点走到了叶子节点并且叶子节点与给定的关键字依然不相等,所以查找不成功的比较次数也是:,
那么二分查找的平均查找长度是多少?为了讨论方便,假定有序表的长度为,则描述二分查找的判定树是深度为h的满二叉树。树中层次为1的节点有1个,层次为2的节点有2个,依次类推,层次为h的节点有
个。假设每个记录查找的概率相等(
),则查找成功时二分查找的平均查找长度为:
当n的规模很大时,则可得出如下近似结果:
由此可见,二分查找的效率是比较高的。
原文:http://blog.csdn.net/xinshen1860/article/details/22188329