数据结构-用面向对象语言描述-殷人昆-第七章
平衡二叉树或者是一棵空树,或者是具有下列性质的二叉排序树:它的左子树和右子树都是平衡二叉树,且左子树和右子树高度之差的绝对值不超过1. 左子树与右子树高度之差称为结点的平衡因子。由平衡二叉树定义可知,平衡二叉树所有结点的平衡因子只能取?1,0,1三个值之一。 如何使建立的一棵二叉排序树是平衡的呢? 这就要求当新结点插入二叉排序树时,必须保持所有结点的平衡因子满足平衡二叉树的要求,一旦不满足要求,就必须进行调整。 关键!! 从插入位置沿着通向根的路径回溯,逐一检查每个节点的平衡因子,当发现不平衡时,这个不平衡节点和向下的两个节点 构成关键的三个节点。 这三个节点的形状决定了需要采取的操作。 * 调整有4种情况 (1)LL型 (2)RR型 (3)LR型 (4)RL型 9.7 B树与B+树 什么是B树? B树的查找 什么是B+树? B+树的查找 通常称用于搜索的数据集合为搜索结构,它是由同一数据类型的对象(或记录)组成。 在每个对象中有若干属性,其中有一个属性,其值可唯一地标识这个对象。称为关键码。使用基于关键码的搜索,搜索结果应是唯一的。但在实际应用时,搜索条件是多方面的,可以使用基于属性的搜索方法,但搜索结果可能不唯一。 实施搜索时有两种不同的环境。 静态环境,搜索结构在插入和删除等操作的前后不发生改变。? 静态搜索表 * 动态环境,为保持较高的搜索效率, 搜索结构在执行插入和删除等操作的前后将自动进行调整,结构可能发生变化。 ? 动态搜索表 在静态搜索表中,数据元素存放于数组中,利用数组元素的下标作为数据元素的存放地址。搜索算法根据给定值 k,在数组中进行搜索。直到找到 k 在数组中的存放位置或可确定在数组中找不到 k 为止。 静态搜索表 * 顺序搜索主要用于在线性表中搜索。 设若表中有 CurrentSize 个元素,则顺序搜索从表的先端开始,顺序用各元素的关键码与给定值 x 进行比较 若找到与其值相等的元素,则搜索成功,给出该元素在表中的位置。 若整个表都已检测完仍未找到关键码与 x 相等的元素,则搜索失败。给出失败信息。 顺序搜索(Sequential Search) * 顺序搜索的平均搜索长度 在等概率情形,pi = 1/n, i = 1, 2, ?, n。搜索成功的平均搜索长度为: 在搜索不成功情形,ASLunsucc = n+1。 * *常用的查找算法 顺序查找 二分查找(折半查找) 分块索引查找 二叉排序树的查找 B树与B+树的查找 Hash(散列)查找 9.2 顺序查找 struct Record { int key; …… }; Record r[n]; 无监视哨的顺序查找: int SeqSearch(Record r[], int n, int k){ int i=0; while (inr[i].key!=k) i++; if (in) return i; else return -1;} 有监视哨的顺序查找 int SeqSearch2(Record r[], int n, int k) { int i=0; r[n].key=k; while (r[i].key!=k) i++; if (in) return i; else return -1; } 顺序查找的平均查找长度为: 顺序查找的特点:算法简单,但查找效率低。 二分查找 二分查找又称为折半查找。 二分查找要求顺序表是有序的。 与中间位置比较,若相等, 则找到! 如果小,则在前半段查找, 否则在后边段查找。 例:[05 13 19 21 37 56 64 75 80 88 92] [05 13 19 21 37] 56 64 75 80 88 92 05 13 19 [21 37] 56 64 75 80 88 92 查找K=21的过程(查找成功) [05 13 19 21 37 56 64 75 80 88 92] 05 13 19 21 37 56 [64 75 80 88 92] 05 13 19 21 37 56 64 75 80 [88 92] 查找K=85的过程(查找失败) 05 13 19 21 37 56 64 75 80 [88 92 ] 二分查找算法(非递归) 二分查找算法(递归) 算法分析
原创力文档

文档评论(0)