数据结构与算法_【9】查找(C++实现)

参考:数据结构与算法基础(青岛大学-王卓)
传送门:
数据结构与算法_【1】概念引入(C++实现)
数据结构与算法_【2】线性表(顺序表链表)(C++实现)
数据结构与算法_【3】栈和队列(C++实现)
数据结构与算法_【4】串数组广义表(C++实现)
数据结构与算法_【5】树和二叉树(C++实现)
数据结构与算法_【6】树和森林(C++实现)
数据结构与算法_【7】哈夫曼树(C++实现)
数据结构与算法_【8】图(C++实现)
数据结构与算法_【9】查找(C++实现)
数据结构与算法_【10】排序(C++实现)

查找

1 查找的基本概念

查找表

在这里插入图片描述

什么是查找?

数据结构与算法_【9】查找(C++实现)_第1张图片

查找成功否?

数据结构与算法_【9】查找(C++实现)_第2张图片

查找的目的

数据结构与算法_【9】查找(C++实现)_第3张图片

查找表怎么分类?

数据结构与算法_【9】查找(C++实现)_第4张图片

如何评价查找算法?

数据结构与算法_【9】查找(C++实现)_第5张图片

查找过程中要研究什么?

数据结构与算法_【9】查找(C++实现)_第6张图片

2 线性表的查找

2.1 顺序查找(线性查找)

数据结构与算法_【9】查找(C++实现)_第7张图片数据结构与算法_【9】查找(C++实现)_第8张图片

代码:

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数据!

数据结构与算法_【9】查找(C++实现)_第9张图片

算法时间效率分析:

数据结构与算法_【9】查找(C++实现)_第10张图片在这里插入图片描述

2.2 折半查找(二分查找)

数据存储时是由有序的,用二分查找!
算法步骤:

数据结构与算法_【9】查找(C++实现)_第11张图片

代码:

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;
}

性能分析

数据结构与算法_【9】查找(C++实现)_第12张图片数据结构与算法_【9】查找(C++实现)_第13张图片在这里插入图片描述

2.3 分块查找

数据结构与算法_【9】查找(C++实现)_第14张图片数据结构与算法_【9】查找(C++实现)_第15张图片数据结构与算法_【9】查找(C++实现)_第16张图片

2.4 各方法比较

数据结构与算法_【9】查找(C++实现)_第17张图片

3 树表的查找(二叉排序树)

数据结构与算法_【9】查找(C++实现)_第18张图片

3.1 二叉排序树(二叉搜索树,二叉查找树)

数据结构与算法_【9】查找(C++实现)_第19张图片数据结构与算法_【9】查找(C++实现)_第20张图片数据结构与算法_【9】查找(C++实现)_第21张图片

算法思想:

数据结构与算法_【9】查找(C++实现)_第22张图片

实现:
用到递归,注意只针对二叉排序树!

数据结构与算法_【9】查找(C++实现)_第23张图片

算法分析:

数据结构与算法_【9】查找(C++实现)_第24张图片数据结构与算法_【9】查找(C++实现)_第25张图片

二叉排序树的插入:

数据结构与算法_【9】查找(C++实现)_第26张图片

二叉排序树的生成:

在这里插入图片描述数据结构与算法_【9】查找(C++实现)_第27张图片

二叉排序树的删除:

数据结构与算法_【9】查找(C++实现)_第28张图片数据结构与算法_【9】查找(C++实现)_第29张图片数据结构与算法_【9】查找(C++实现)_第30张图片数据结构与算法_【9】查找(C++实现)_第31张图片数据结构与算法_【9】查找(C++实现)_第32张图片

4 树表的查找(平衡二叉树)

平衡二叉树定义:

数据结构与算法_【9】查找(C++实现)_第33张图片

平衡因子(BF) = 结点左子树高度 - 结点右子树高度
平衡二叉树上所有结点的平衡因子只能是-1、0、1

数据结构与算法_【9】查找(C++实现)_第34张图片

失衡二叉排序树的分析和调整

数据结构与算法_【9】查找(C++实现)_第35张图片数据结构与算法_【9】查找(C++实现)_第36张图片

(1)LL型调整

数据结构与算法_【9】查找(C++实现)_第37张图片

(2)RR型调整

数据结构与算法_【9】查找(C++实现)_第38张图片

(3)LR型调整

数据结构与算法_【9】查找(C++实现)_第39张图片

(4)RL型调整

数据结构与算法_【9】查找(C++实现)_第40张图片

例题:

数据结构与算法_【9】查找(C++实现)_第41张图片数据结构与算法_【9】查找(C++实现)_第42张图片数据结构与算法_【9】查找(C++实现)_第43张图片数据结构与算法_【9】查找(C++实现)_第44张图片数据结构与算法_【9】查找(C++实现)_第45张图片

5 散列表的查找

5.1 相关概念

基本思想:记录存储位置与关键字之间存在的对应关系

优点:查找效率高
缺点:空间效率低

若干术语:

数据结构与算法_【9】查找(C++实现)_第46张图片数据结构与算法_【9】查找(C++实现)_第47张图片

构造散列函数考虑的因素:

数据结构与算法_【9】查找(C++实现)_第48张图片数据结构与算法_【9】查找(C++实现)_第49张图片

直接定址法:

数据结构与算法_【9】查找(C++实现)_第50张图片

除留余数法:

数据结构与算法_【9】查找(C++实现)_第51张图片

解决冲突问题:
(1)开放地址法

数据结构与算法_【9】查找(C++实现)_第52张图片

(2)链地址法(拉链法)

数据结构与算法_【9】查找(C++实现)_第53张图片数据结构与算法_【9】查找(C++实现)_第54张图片数据结构与算法_【9】查找(C++实现)_第55张图片

5.2 查找:

例题:

数据结构与算法_【9】查找(C++实现)_第56张图片数据结构与算法_【9】查找(C++实现)_第57张图片

几种方法比较:

数据结构与算法_【9】查找(C++实现)_第58张图片数据结构与算法_【9】查找(C++实现)_第59张图片数据结构与算法_【9】查找(C++实现)_第60张图片

你可能感兴趣的:(数据结构与算法学习笔记,数据结构,算法,c++,哈希表,哈希函数)