参考:数据结构与算法基础(青岛大学-王卓)
传送门:
数据结构与算法_【1】概念引入(C++实现)
数据结构与算法_【2】线性表(顺序表链表)(C++实现)
数据结构与算法_【3】栈和队列(C++实现)
数据结构与算法_【4】串数组广义表(C++实现)
数据结构与算法_【5】树和二叉树(C++实现)
数据结构与算法_【6】树和森林(C++实现)
数据结构与算法_【7】哈夫曼树(C++实现)
数据结构与算法_【8】图(C++实现)
数据结构与算法_【9】查找(C++实现)
数据结构与算法_【10】排序(C++实现)
查找
1 查找的基本概念
查找表
什么是查找?
查找成功否?
查找的目的
查找表怎么分类?
如何评价查找算法?
查找过程中要研究什么?
2 线性表的查找
2.1 顺序查找(线性查找)
代码:
template<typename T>
int SeqList<T>::Search_Seq(T key)
{
for (int i = 0; i < this->size; i++)
{
if (key == this->elem[i])
{
return i + 1;
}
}
cout << "查询失败,返回-1" << endl;
return -1;
}
改进,不用判断是否越界
改进后的查找可以消除一次判断,平均时间会减少一半,但是顺序表index0不能存储数据,要用来存储key数据!
算法时间效率分析:
2.2 折半查找(二分查找)
数据存储时是由有序的,用二分查找!
算法步骤:
代码:
template<typename T>
int SeqList<T>::Search_Bin(T key)
{
int low = 0;
int high = this->size - 1;
int mid;
while (low <= high)
{
mid = (low + high) / 2;
if (key == this->elem[mid])
{
return mid + 1;
}
else if (key > this->elem[mid])
{
low = mid;
}
else
{
high = mid;
}
}
cout << "查询失败,返回-1" << endl;
return -1;
}
性能分析
2.3 分块查找
2.4 各方法比较
3 树表的查找(二叉排序树)
3.1 二叉排序树(二叉搜索树,二叉查找树)
算法思想:
实现:
用到递归,注意只针对二叉排序树!
算法分析:
二叉排序树的插入:
二叉排序树的生成:
二叉排序树的删除:
4 树表的查找(平衡二叉树)
平衡二叉树定义:
平衡因子(BF) = 结点左子树高度 - 结点右子树高度
平衡二叉树上所有结点的平衡因子只能是-1、0、1
失衡二叉排序树的分析和调整
(1)LL型调整
(2)RR型调整
(3)LR型调整
(4)RL型调整
例题:
5 散列表的查找
5.1 相关概念
基本思想:记录存储位置与关键字之间存在的对应关系
优点:查找效率高
缺点:空间效率低
若干术语:
构造散列函数考虑的因素:
直接定址法:
除留余数法:
解决冲突问题:
(1)开放地址法
(2)链地址法(拉链法)
5.2 查找:
例题:
几种方法比较: