查找一章总结

1.静态查找表 (线性表):
      操作:
              1)查询某个“特定的”数据元素是否在查找表中;
               2)检索某个“特定的”数据元素的各种属性
     顺序查找:
                       即用逐一比较的办法顺序查找关键字,
                       这显然是最直接的办法。
             技巧:
                       把待查关键字key存入表头或表尾(俗称“哨兵”),这样可以加快执行速度。
                       我们看一下程序就知道哨兵的好处:            

int Search_Seq(SSTable ST, 
                                      KeyType key) {
   // 在顺序表ST中顺序查找其关键字等于
    //  key的数据元素。若找到,则函数值为
    // 该元素在表中的位置,否则为0。
   ST.elem[0].key = key;      // “哨兵”
   for (i=ST.length; ST.elem[i].key!=key;  --i);  
                             // 从后往前找
   return i;            // 找不到时,i为0
} // Search_Seq
            如果不设哨兵  for(i=1;ST.elem[i!=key&&i>=0;--i])多了 n个i>=0判断比较,设了 哨兵后,往前--i 肯定会有==情况所以有哨兵可以降低程序复杂度。
      折半查找:
                      折半查找只适用于有序顺序表( 顺序存储结构),如果链式计算地址 (low+high)/2不好算没优势。
      分块查找:
                      分块查找表是基于索引的。  块内无序,块间有序。
                      看下图:

                                      
                  哈希表:  
                                  1.开散列表(链地址法)   2.闭散列表 (开放定址法) 。
                     哈希是基于计算的思想,其他都是基于比较的思想。

动态查找表(基于树):
              二叉排序树
                    二叉排序树主要注意删除算法如下图:

      
              每个问题都有关键点和突破点对既有左子树又有右子树的二叉排序树就是(以前驱替代之,然后在删除该前驱结点),可以看到上图40代替了50,并且把以前的40删了。
             平衡二叉树
              平衡二叉树主要注意左右手原则和以哪个节点为旋转轴两点。
               
                  注意这是以B为旋转轴。
              再看LR,RL情况:
            
                这是以C为旋转轴,这两种情况要搞清楚,不然容易混淆
              B-树
                  B-树主要应用于文件系统当中。
                   结构如下:
                  1) B-树是一种 平衡多路查找树:
                   2) 非终端结点的结构如下:

n
p0
k1
p1
k2
p2
ki
pi
kn
pn
                    一棵度为m的B-树称为m阶B_树。一个结点有k个孩子时,必有k-1个关键字才能将子树中所有关键字划分为k个子集。B-树中所有结点的孩子结点最大值称为B-树的   阶,通常用m表示。从查找效率考虑,一般要求m≥3。一棵m阶的B-树或者是一棵空树,或者是满足下列要求的m叉树:
                (1)根结点或者为叶子,或者至少有两棵子树,至多有m棵子树。
               (2)除根结点外,所有非终端结点至少有ceil(m/2)棵子树,至多有m棵子树。
               (3)所有叶子结点都在树的同一层上。
               (4)每个结点的结构为:
                      (n,A0,K1,A1,K2,A2,…  ,Kn,An)( A0从0开始所以子树可以m,关键字最多m-1)。
                       其中,Ki(1≤i≤n)为关键字,且Ki<Ki+1(1≤i≤n-1)。
                    Ai(0≤i≤n)为指向子树根结点的指针。且Ai所指子树所有结点中的关键字均小于Ki+1。An所指子树中所有结点的关键字均大于Kn。
                   n为结点中关键字的个数,满足 ceil(m/2)-1≤n≤m-1
                     一颗4阶B-树如下:
                 
                可以看到每个节点第一个数字n代表关键字个数。认清这个结构B-树的一些性质就能够想到。
                 B-树在 查找方面特性为( 平衡多路查找树):             

                    •非叶结点中的 多个关键字自小至大有序排列,即: K1< K2 < … < Kn 
                    •  Ai-1 所指子树上所有关键字均 小于Ki 
                    •  Ai 所指子树上所有关键字均 大于Ki 
                 B-树 平衡方面的特性( 平衡多路查找树):
                    •树中所有叶子结点均不带信息,且在树中的同一层次上, 叶子结点不包含任何关键字信息(如图可以看出)
                    •根结点或为叶子结点,或至少含有两棵子树;
                    •其余所有非叶结点均至少含有[ m/2](m/2向上取整)棵子树,至多含有 m 棵子树(最多有多少子树就是多少阶, m阶最多m-1个关键字从图可以看出);
                 如果要对B- 更深入了解可以参考: http://blog.163.com/zhoumhan_0351/blog/static/39954227200910231032917/ (讲得很细致)        
              B+树:
                          
                   注意B+树很大不同就是所有关键字都在叶子结点出现。所以

                   B+树的搜索:B+的搜索与B-树也基本相同,区别
             1.是
B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
             2.为所有叶子结点增加一个链指针所以可以顺序搜索。            

        B+的特性:

            1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好

               是有序的;

            2.不可能在非叶子结点命中;

            3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

            4.更适合文件索引系统;
        要具体了解B 族类的树参考:http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html
        关于B树、B-树、B+树、B*树的一些规定是根据效率来规定的。
        (如:B-树中要规定非终端接点的关键字数目必须大于m/2(m是树的阶)必须<m-1。
         最常使用B树的地方是数据库,把数据和索引都放在块设备上,需要的时候再读出来,这时候,通常用一个或几个块存放B树的一个节点,访问的时候,从根开始依次往子节点访问,显然访问的节点数越少越好,也就是没一个节点上的关键字越多越好...这样可以减少读写存储设备的次数,提高检索效率..>m/2是为了保证树的高度尽可能的小)。


                 


                  
 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值