二分查找判定树 二分查找过程可用二叉树来描述把当前查找区间的中间位置上的结点作为根左子表和右子表中的结点分别作为根的左子树和 右子树由此得到的二叉树称为描述二分查找的判定树(Decision Tree)或比较树(Comparison Tree) 注意 判定树的形态只与表结点个数n相关而与输入实例中R[n]keys的取值无关 【例】具有个结点的有序表可用下图所示的判定树来表示 ()二分查找判定树的组成 ①圆结点即树中的内部结点树中圆结点内的数字表示该结点在有序表中的位置 ②外部结点圆结点中的所有空指针均用一个虚拟的方形结点来取代即外部结点 ③树中某结点i与其左(右)孩子连接的左(右)分支上的标记<(>)表示当待查关键字 KR[i]key)时应走左(右)分支到达i的左(右)孩子将该孩子的关键字进一步和K比较若相等则查找过程结束返 回否则继续将K与树中更下一层的结点比较 ()二分查找判定树的查找 二分查找就是将给定值K与二分查找判定树的根结点的关键字进行比较若相等成功否则若小于根结点的关键字到左子树 中查找若大于根结点的关键字则到右子树中查找 【例】对于有个结点的表若查找的结点是表中第个结点则只需进行一次比较;若查找的结点是表中第或第个结点则 需进行二次比较;找第个结点需要比较三次;找到第个结点需要比较四次 由此可见成功的二分查找过程恰好是走了一条从判定树的根到被查结点的路径经历比较的关键字次数恰为该结点在树中的层 数若查找失败则其比较过程是经历了一条从判定树根到某个外部结点的路径所需的关键字比较次数是该路径上内部结点的总数 【例】待查表的关键字序列为()若要查找K=的记录所经过的内部结点为 最后到达方形结点其比较次数为 实际上方形结点中ii+的含意为被查找值K是介于R[i]key和R[i+]key之间的即R[i]key (3)二分查找的平均查找长度 设内部结点的总数为n=2 h -1,则判定树是深度为h=lg(n+1)的满二叉树(深度h不计外部结点)。树中第k层上的结点个数为2 k- 1 ,查找它们所需的比较次数是k。因此在等概率假设下,二分查找成功时的平均查找长度为: ASL bn ≈lg(n+1)-1 二分查找在查找失败时所需比较的关键字个数不超过判定树的深度,在最坏情况下查找成功的比较次数也不超过判定树的深度 。即为: 二分查找的最坏性能和平均性能相当接近。 6、二分查找的优点和缺点 虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费 O(nlgn)的时间。 二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适 用于那种一经建立就很少改动、而又经常需要查找的线性表。 对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。 |