数据结构与算法:查找

7.0 知识回顾

在这里插入图片描述

7.1 查找的概念

注意:基本概念要经常回顾,尤其是在学完本章之后,这样便于深入理解基本概念,构建整章的知识体系。
在这里插入图片描述
松散的关系:没有严格的前驱和后继,所以查找表可以有不同的存储结构。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2 线性表的查找

在这里插入图片描述

7.2.1 顺序表的顺序查找

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2.2 折半查找(二分查找)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
折半查找的时间复杂度是对数级lgn
在这里插入图片描述

7.2.3 分块查找

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.3 树表的查找

在这里插入图片描述

7.3.1 二叉排序树

1)概念

在这里插入图片描述
局部上:左子树 < 根 < 右子树,但是整体上“所有结点”还是要满足二叉排序树的定义。
在这里插入图片描述
在这里插入图片描述

2)查找

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3)插入

在这里插入图片描述
在这里插入图片描述
二叉排序树插入算法

//二叉排序树的插入操作
void InsertBST_Real(BSTree& T, keytype key) {
    if (!T) {
        T = new BSTNode;
        T->data.key = key;
        T->lchild = NULL;//创建一个新树,不仅要给数值域赋值,还要记得给左右孩子的指针域赋值!!
        T->rchild = NULL;//错误点:忘记左右孩子指针域的赋值,TMD!
    }
    else if (key < T->data.key)
        InsertBST_Real(T->lchild, key);
    else if (key > T->data.key)
        InsertBST_Real(T->rchild, key);
}
4)生成

重点
生成二叉排序树就是不断地执行 “二叉排序树插入操作”
在这里插入图片描述
二叉排序树生成算法

//二叉排序树的插入操作
void InsertBST_Real(BSTree& T, keytype key) {
    if (!T) {
        T = new BSTNode;
        T->data.key = key;
        T->lchild = NULL;//创建一个新树,不仅要给数值域赋值,还要记得给左右孩子的指针域赋值!!
        T->rchild = NULL;//错误点:忘记左右孩子指针域的赋值,TMD!
    }
    else if (key < T->data.key)
        InsertBST_Real(T->lchild, key);
    else if (key > T->data.key)
        InsertBST_Real(T->rchild, key);
}

//二叉排序树的生成
void CreatBST_Real(BSTree& T, keytype key[], int n) {
    for (int i = 0; i < n; i++) {
        InsertBST_Real(T, key[i]);
    }
}

在这里插入图片描述
在这里插入图片描述

中序遍历二叉排序树,就可以获得升序序列。

5)删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

判断是否为叶子结点:判断左右孩子是否都为空。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下只是用代码的形式来表示上面的例子,具体程序还需要更多的判断语句。

    if(T->rchild->data.key == 80);
    T->rchild = T->rchild->rchild;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.3.2 平衡二叉树

在这里插入图片描述
在这里插入图片描述

1)定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
调整原则非常重要
Tips:找到大小位于中间的提上去就行

2)LL调整

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3)RR型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4)LR型

在这里插入图片描述
在这里插入图片描述
不懂就看视频p151 11:00
在这里插入图片描述

5)RL型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6)例题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
综上,构成了一个查找性能最好的二叉排序树

原视频链接

7.4 散列表上的查找

7.4.1 散列表的基本概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4.2 散列函数的构造方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4.3 如何解决“冲突”

在这里插入图片描述

1.开放定址法(开地址法)

在这里插入图片描述

1)线性探测法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查找时,首先将查找对象mod11,看结果的地址中的元素是否等于查找对象,等于的话输出地址,不等于的话将地址加1,再判断是否找到,按照线性探测法的规定,直到找到或者遇到空位置为止。

2) 二次探测法

在这里插入图片描述

3) 伪随机探测法

在这里插入图片描述

2. 链地址法(拉链法)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4.4 散列表的查找

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4.5 散列表平均查找长度(ASL)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4.6 结论

在这里插入图片描述
查找性能:散列表 > 二分查找 > 顺序查找

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值