一、 顺序表特点:查找要从第一个元素开始,逐个访问元素。表中第一个元素起始位置确定后,则顺序表中的任一数据元素都可随机存取。
二、 折半查找(二分查找):要求所查找顺序表中的元素按值或关键字前后有序描述,方法是先确定待查元素所在范围(区间),然后逐步缩小范围直到找到或没有找到该元数为止。
三、 实际应用举例:
①、二分查找在图像处理中的应用
在图像处理中,常常将图像数据分块存放。而为了使邻近图像块的数据集中存放,我们常使用一种树状的分块方案:即将整个图像平面作为树的根结点,四块四块分下去。分块后图像及其编号方式。
分块直方图
0 | 1 | 4 | 5 |
2 | 3 | 6 | 7 |
8 | 9 | 12 | 13 |
10 | 11 | 14 | 15 |
由分块直方图知:图形是以“4”为单位逐步细分的,因此,每次分块中,图形的中心坐标总是第(N * 3/4)块的左上顶点坐标(N为总块数)。所以,我们以该顶点为中心将欲分块区划分为四个区,如下图:
0 |
1 |
2 | (x0,y0) 3 |
结论:
if(x < x0 && y < y0) x,y∈1区;
else if ( x > = x0 && y < y0 ) x,y∈0区;
else if (x < x0 && y > = y0) x,y ∈2区;
else x,y ∈ 3区;
根据分块方式及存储顺序可得,0区的所有块编号在全部编号中的位置为0~N * 1/4;1区在N * 1/4 ~ N * 2/4;2区所有编号块的位置为N * 2/4 ~ N * 3/4;3区所有块N * 3/4 ~ N。判断出目标点所在区后,以该区为范围,迭代查找。这样经过几次后,就可得出目标点的块编号。
算法执行中,若对平面分块数为N,则只须判断log4N次即可得出目标点的块号。
参考文献:信息工程学院基础部 奚玲 《二分查找法在图像处理中的运用》
② 基于位的二分查找:
数据在内存中是以二进制形式存放的。对有符号数而言,最高位为0表示正数,最高位为了表示负数。由于二分查找的基础是在有序的数据中查找,所以不妨设数据是从小到大排列的。具体算法如下:
(1) 判断符号位,统计负数个数n1。
(2) 初始化p(用来指定被比较的二进制位的位置,初始值为L-2)。判断待查找数Z的3符号位,若为1,则设i = 0, j = n1 – 1;否则,设 i=n1,j = N – 1.转(3)。
(3) 若i < =j,k = (i + j)/2,转(4);否则转(6)。
(4) 比较z与a[k]的第p位。若相同,p = p- 1,直到p 为-1,找到,查找结结束,否则转到(5)。
(5) 若z的符号位为1且第p位为1,则i =k +1,p =L-2;
否则若z的符号位为1且第p位为0,则j = k – 1,p = L -2;
否则若z的符号位为0且第p位为1,则i =k+1,p=L-2;
否则j =k-1,p=L-2. 转(3)。
(6)没有找到,查找结束。
结论:基于位的二分查找算法适用于大规模整数构成的集合,是直接利用数据的二进制位信息进行比较,无需对数据进行二进制与十进制转换。
参考文献:南京信息工程大学 成亚平
四、二分查找步骤:(查找元素30)
3 | 5 | 7 | 8 | 12` | 20 | 24 | 27 | 38 | 50 | 78 |
↑low ↑mid ↑high
Mid = (1 + 11)/2=6;
3 | 5 | 7 | 8 | 12` | 20 | 24 | 27 | 38 | 50 | 78 |
↑low ↑mid ↑high
3 | 5 | 7 | 8 | 12` | 20 | 24 | 27 | 38 | 50 | 78 |
↑low/mid ↑high
3 | 5 | 7 | 8 | 12` | 20 | 24 | 27 | 38 | 50 | 78 |
↑low/mid/high
3 | 5 | 7 | 8 | 12` | 20 | 24 | 27 | 38 | 50 | 78 |
↑high/mid ↑low
总结:二分查找的算法时间复杂度为O(log2n).二分查找的优点是比较的次数少,查找速度快。但二分查找只适用于顺序存储结构有序表,这种速度是以预先对记录按关键字大小排序为代价的。另外由于存结构为数组或向量,所以对经常要插入和删除操作的表,不宜采用此法。因此二分查找比较适用于那种一经建立就很少改动,而又经常查找的线性表。