数据结构--查找

参考青岛大学–王卓老师

一、查找的基本概念

查找表:是由同一类型的数据元素(或者记录)构成的集合。
主关键字:可唯一标识一个记录的关键字是主关键字。
次关键字:用以识别若干记录的关键字成为次关键字。
查找表分为:静态查找表、动态查找表。
平均查找长度(ASL):关键字的平均比较次数。

二、线性表的查找

1.顺序查找

静态查找表,表内的元素是无序的
数据结构--查找_第1张图片
改进:
将key作为监视哨放在头部,当数组较长的时候,能够使进行一次的查找所需的平均时间几乎减少一半。
数据结构--查找_第2张图片
平均查找长度:(n+1)/2

2.折半查找(二分或者对分查找)

仅适用于有序表,相当于二分算法,仅限于顺序存储结构
非递归算法:
数据结构--查找_第3张图片
递归算法:
数据结构--查找_第4张图片
将这种性能用树来表示:
数据结构--查找_第5张图片
平均查找长度:
在这里插入图片描述

3.分块查找(索引顺序表查找)

将最大值写入一个索引表儿,将目标值与索引表中这 部分的最大值进行比较,应用于动态的
数据结构--查找_第6张图片
平均查找长度:对索引表的查找+对块内的查找

数据结构--查找_第7张图片
三种查找方式比较:
数据结构--查找_第8张图片

三、树表的查找

动态查找表

1.二叉排序树

左子树小于根节点,右子树大于根节点
数据结构--查找_第9张图片
对该树进行中序遍历,得到:3,12,24,37,45,53,61,78,90,100
递增有序
与查找的值与根节点比较,小到左子树,大到右子树
算法:利用递归思想进行查找数据结构--查找_第10张图片
比较关键词的次数=树的层数
最大次数=树的深度
平均查找长度:与树的形态有关
数据结构--查找_第11张图片
解决方式:对树进行平衡
插入:
看一下是不是空,若空,则为根节点
非空:树中已经有则不再插入,树中没有,查找直到某个叶子结点的左子树或者右子树为空为止,插入结点为叶子结点的左孩子或者右孩子
生成:
将无序的树进行排序生成有序的,第一个为根结点,其他的往中间插入。
删除:

  • 叶子结点直接删除
  • 只有左子树或者右子树,则直接去除,将双亲结点的指针域的值指向被删除结点的左子树或者右子树
  • 既有左子树,又有右子树,前驱替换:寻找左子树上的最大结点,替换它,将左子树中最大的删掉;后继替换:寻找右子树中最小的结点,替换它,将左子树中的最小删除了

举例:
数据结构--查找_第12张图片

2.平衡二叉树

平衡因子:左子树的高度-右子树的高度
定义:AVL树,平衡二叉树的平衡因子只能是-1,0,1
数据结构--查找_第13张图片
原则:降低高度,保持二叉排序树的性质(左子树比根小,右子树比根大)
如果两个点都失衡,则找最小的失衡子树
数据结构--查找_第14张图片

四、散列表(哈希)的查找

1.基本概念

对应关系–hash函数 H(key)=k
如果 H(key1)= H(key2)则出现冲突,key1和key2称为同义词
地址空间尽量少,排列尽量均匀

2.构造方法

散列函数的构造方法:

  1. 直接定址法
  2. 数字分析法
  3. 平方取中法
  4. 折叠法
  5. 除留余数法
  6. 随机数法

直接定址法(不会冲突):
hash(key)=a*key+b
除留余数法:
hash(key)=key mod p

3.处理冲突的方法

a.开放定址法

数据结构--查找_第15张图片

数据结构--查找_第16张图片
数据结构--查找_第17张图片
同理,伪随机探测法,di是伪随机数

b.链地址法

相同的散列地址的记录链成一个单链表,m个散列地址就设m个单链表
数据结构--查找_第18张图片

c.再散列法
d.建立一个公共溢出区

4.散链表的查找

数据结构--查找_第19张图片
数据结构--查找_第20张图片

你可能感兴趣的:(数据结构)