第七章知识总结

第七章 查找

查找的概念

  1. 查找表:同一类型的数据元素构成的集合。包含线性表、树表和散列表。
  2. 关键字:标识一个数据元素

        主关键字:唯一地标识一个记录

Key1

Otherinfor1

        次关键字:标识若干记录

Key1

Otherinfor1

Otherinfor2

Otherinfor3

        注:当数据元素只有一个数据项时,关键字=该数据元素

  1. 查找
  2. 动态查找表(结构本身是在查找过程中动态生成的)和静态查找表
  3. 平均查找长度:在找到目标关键字时,需要和定值进行比较地关键字个数的期望值

 

线性表查询

  顺序查找

从表的一端开始,依次比较记录的的关键字和给定值,若想等则查找成功,反之查找失败。书上讲述了基于顺序表实现的顺序查找算法,并通过设置监视哨来进行改良。

数据元素类型定义:

关键字域key

其他域otherinfo

 

  折半查找

从中间记录开始,如果给定值和中间记录相等,则查找成功;如果给定值大于或等于中间记录的关键字,则在表中大于或者小于中间记录的那一半中查找,重复操作直到查找成功,若某一步查找区间为空,则查找失败。

数据元素类型定义:

关键字域key

其他域otherinfo

   分块查找

介于顺序查找和折半查找之间,需要建立一个“索引表”,其中包括关键字项和指针项。

 

树表查找

线性表的查找更适用于静态查找表,若要对动态查找表进行高效率的查找,可采用树表。

 

  二叉排序树

1. 定义:左子树上所有结点值均小于根结点的值,右子树的所有结点均大于根结点。

数据结构类型:(书上给定了基于二叉排序树的二叉链表):

 

关键字域key

其他域otherinfo

左孩子指针lchild

右孩子指针rchild 

2.查找:二叉排序树的查找和折半查找类似,稍微不同的地方就是当关键字key与给定值比较大了或者小了,就用递归的方法查找key对应结点的右子树或者左子树。

3.二叉排序树的构建

  初始化空树

  读入key结点

  插入读入关键字key对应的结点

void CreateBST(BSTree &T)
{//依次读入一个关键字为key的结点,将此节点插入二叉排序树中
    T=NULL;
    cin>>e;
    while(e.key!=ENDFLAG)
    {
          InsertBST(T,e);  //将此结点插入二叉排序树中
          cin>>e;
    }
 }
InsertBST(BSTree &T,ElemType e)
{//当二叉排序树T中不存在关键字等于e.key的数据元素是,则插入该元素
  if(!T)
  {
    s=new BSTNode;
    s->data=e;
    s->lchild=s->rchild=NULL;  
    T=S;
  }
  else if(e.key<T->data.key)
    InsertBST(T->lchild,e);
  else if(e.key>T->data.key)
    InsertBST(T->rchild,e);
}

4.二叉排序树的删除:

  (1)p左右子树都为空,直接修改双亲结点指针

  (2)p只有左子树或者只有右子树,让左子树或者右子树直接成为双亲结点的左子树

  (1)p左右子树都不为空,第一种令p的左子树成为双亲结点的左子树,令p的右子树成为左子树最大元素的右子树;第二种直接取出左子树最大元素s代替p结点的位置,令p的左子树成为s的左子树,p的右子树为s的右子树。

 

  平衡二叉树

左右子树深度之差就对峙不超过1,左右子树也是二叉平衡树,四种调整规律:LL型、RR型、LR型、RL型。

  

  B-树和B+树

B-树是一种平衡的多叉查找树,B+树是B-树的一种变形树,适合做文件系统的索引。

 

散列表查找

基于线性表和树表结构的查找方法都是以关键字的比较为基础的,而散列表查找则是通过对元素关键字值进行某种运算,直接求出元素的地址,不需要进行反复比较。

散列表函数的构造有:数字分析法、平方取中法、折叠法和除留余数法。而针对当不同关键字可能得到同一散列地址的问题,又提出了开放地址法和链地址法。

 

小结:查找这一章节的知识点很多,而且综合性比较强,因此本篇小结主要是对知识点进行梳理。

下次目标:希望能够结合PTA代码编程题进一步解释书中的概念和算法。

 

posted on 2019-06-02 23:05  黄油田  阅读(143)  评论(0编辑  收藏  举报