第七章学习小结

第七章学习小结

查找

查找是根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素,若存在,则查找成功,查找结果可以给出整个记录的信息,或指示该记录在查找表中的位置。若查找不成功,则查找结果可以给出一个空记录或空指针

 

7.2 线性表的查找

(一) 顺序查找:依次比较

  可设定哨兵:数组ST.R【0】闲置不用,可将其关键字置为key,从后往前比较,比较到0则说明没有,并自动退出

优点:对表的结构没有要求,即可用顺序结构,又可用链式结构,无论表有无顺序都可用

(二) 折半查找:二分查找

  从表中间开始,若给定值与中间元素相等,则返回地址值,若小于中间值,则在中间值的左边区域查找,若大于,则在右边查找。以此递归。

  设定左标志l和右标志r,和中间值mid=(l+r)/2,用所给定的关键值和mid进行比较,等于则OK,小于则r=mid-1;大于则l=mid+1;形成递归,当r<l时退出。

优点:比较次数少,查找效率较高。

缺点:对表的要求高,只能用顺序存储的有序表。(排序可能增大时间复杂度至n)

不适用于数据元素经常变动的动态线性表。

(三)分块查找法

 

 

7.3树表的查找

  (一) 二叉排序树:(递归定义)

1,定义:

二叉排序树或者是一颗空树,或者是具有下列性质的二叉树:

左子树小于根结点,右子树大于根结点

2,二叉存储树的二叉链表存储表示:

Typedef struct
{
  KeyType key;//关键字项
  InfoType otherinfo;//其他数据项
  }ElemType;//每个结点的数据域的类型
Typedef struct BSTNode
{
  ElemType data; //数据域
  Struct BSTNode *lchild, *rchild;//左右孩子指针
}BSTNode *BSTree;
View Code

 

 

3,二叉树的查找:

  Key 与T->data.key比较,如果相等,则成功,返回根结点地址

  如果小于,则递归查找左子树

  如果大于,递归查找右子树。

4,二叉树的插入:

先弄好新结点,数据域赋值,叶子结点置空,再根据3的方法比较,放置该新结点

5,二叉树的删除(多讨论)

(1)     当删除的是叶子结点(无左右孩子)

直接改变父母结点的指针域,使其置空

(2)     若删除的结点有一个孩子结点

直接让该结点代替被删除的结点成为其双亲结点的左子树或右子树

(3)     若删除的结点既有左孩子又有右孩子

设删除结点为p

p左子树的最右叶子结点x(最大值)取代p,x的左子树取代x。

7.3.3  B-树,B+树

7.4 散列表的查找

(一) 基本概念

让元素的存储位置和其关键字建立某种直接关系

(二)  构造方法

考虑因素

(1)     散列表的长度

(2)     关键字的长度

(3)     关键字的发布情况

(4)     计算散列函数所需的时间

(5)     记录的查找频率

 

1, 数字分析法

数字前几位是相同的,变的只有几位

2, 平方取中法

3, 折叠法

4, 除留余数法(超常用)

p为小于表长的最大素数,用p去除关键字,除后的余数为散列地址

 

7.43 处理冲突的方法

1)线性探测法,出现冲突,就一直找下一个是否有空位

2)二次探测法,出现冲突,先找后一个,后一个没有就再找前一个,然后找后两个位,然后找前两个位,一直到找到为止。(常用)

3)伪随机探测法

 

7.44 散列表的查找

---开放地址法散列表的存储表示---

#define m 20
Typedef struct{
KerType key;//关键字项
InfoType otherinfo;//其他数据项
}HashTable[m];
View Code

本周目标 

作业还没写完,争取在周一就完成,要尝试不断优化自己的代码。

数据结构已经学得差不多了,应该开始进行每章的总结和对比。

posted @ 2019-06-02 18:29  Y000  阅读(135)  评论(0编辑  收藏  举报