数据结构与算法——第八章(查找——顺序——折半——二叉——哈希)

一,顺序查找

1,顺序查找定义(优缺)

从表的一端开始,顺序扫描线性表,依次将扫描到的节点关键字和给定值k相	比较。		
顺序查找主要用于线性表中的查找,其中,线性表可有序可无序。

缺点:

顺序查找的缺点是,当n较大时,平均查找长度较大,效率低

优点:

优点是对数据元素的存储没有要求,顺序存储或链式存储皆可。

2,查找算法的平均长度计算

在这里插入图片描述

在这里插入图片描述

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

1,折半查找定义(优缺)

在这里插入图片描述
优点:

优点是比较次bai数少,查找速度du快,平均性能好;

缺点:

缺点是要求待查表为有序表,且限于顺序存储结构,且插入删除困难。
because:
插入困难是因为折半查找法要求待查表为有序表,所以在插入的时候你就
不能随便插入了。你必须找到待插入的元素在表中的位置才可以插入,所
以插入的时候比较麻烦。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

2, 折半查找平均长度计算

ASL= log2(n+1)-1

在这里插入图片描述

首先,折半查找可以借助于一个二叉树来描述。
为了简化讨论,则把这棵树近似看成满二叉树,设二叉树的高度为h(h>1)
则,根据二叉树的性质,它有最大节点数n=2^{h}-1,
则h=log2(n+1)。
那么二叉树的第j层节点数为:2^(j-1) # (2是底数),
当最后一层也就是2^(h-1)
假定每个元素的查找概率相等,则,
pi=1/n (pi为第i个节点的查找概率)
Ci=每一层的节点数乘以层数再相加=1*2^0+2*2^1+3*2^2+……+j*2^(j-1))
那么平均查找长度为ASL= 1/n*1*2^0+2*2^1+3*2^2+……+j*2^(j-1))
则经过化简计算,得平均查找长度为:((n+1/n ) *log2(n+1)-1 (其中对数中的2为底数:即log以2为底(n+1)的对数)
注 : 当n很大时 ,可近似为ASL= log2(n+1)-1

其中 1*2^0+2*2^1+3*2^2+……+j*2^(j-1)的求法如下:
设 S = 1*2^0 + 2*2^1+3*2^2 +……+ j*2^(j-1) ,
则 2S = 1*2^1+2*2^2 +……+ (j-1)*2^(j-1) + j*2^j
则 2S - S = -( 2^0 + 2^1 + 2 ^2 + …… + 2 ^(j-1)) + j *2^j
即 S = - (2^j-1)+j*2^j           (这里的j相当于h)
带入化简即可。

3,判定树的计算

(1),最大查找次数与最少查找次数

根据下图计算,计算步骤在下面
根据折半查找判定树可以推出最多查找次数为自己的深度
h=log2(n+1)——n代表节点数
最少查找次数为:h-1

简单快速计算方法:(就是这么简单)

假设给你n个节点求最多查找次数与最少查找次数
2^j< n <2^k
则最少查找次数为:j
  最多查找次数为:k

(2),判定树的构造推理

在这里插入图片描述
第一次访问
low=1,high=11,则mid=(low+high)/2=6(“/”代表除以2取整)
则6就为根节点
第二次访问
假设1:如果关键字比6大,则low=mid+1, high=11(不变)
则mid=(low+high)/2=9
假设1:如果关键字比6小,则high=mid-1, low=1(不变)
则mid=(low+high)/2=3
则第二层节点就是3和9(小的放在左边,大的放在右边)
第三次访问
有四个假设
假设一:key>9
mid=(low+high)/2=10
假设二:key<9
mid=(low+high)/2=7
假设三:key>3
mid=(low+high)/2=4
假设四:key<3
mid=(low+high)/2=1
则第三层节点就是:1,4,7,10(小的放在左边,大的放在右边)
以此类推

三,二叉排序树

1, 二叉排序树定义(优缺)

二叉排序数的(递归)定义:
1、若左子树非空,则左子树所有节点的值均小于它的根节点;
2、若右子树非空,则右子树所有节点的值均大于于它的根节
点;3、左右子树也分别为二叉排序树

优点:

数组的搜索比较方便,可以直接用下标,但删除或者插入某些元素就比较麻烦。
链表与之相反,删除和插入元素很快,但查找很慢。
二叉排序树就既有链表的好处,也有数组的好处。
在处理大批量的动态的数据是比较有用。

2,二叉树排序的平均长度

与折半查找计算方法类似

首先,折半查找可以借助于一个二叉树来描述。
为了简化讨论,则把这棵树近似看成满二叉树,设二叉树的高度为h(h>1)
则,根据二叉树的性质,它有最大节点数n=2^{h}-1,
则h=log2(n+1)。
那么二叉树的第j层节点数为:2^(j-1) # (2是底数),
当最后一层也就是2^(h-1)
假定每个元素的查找概率相等,则,
pi=1/n (pi为第i个节点的查找概率)
Ci=每一层的节点数乘以层数再相加=1*2^0+2*2^1+3*2^2+……+j*2^(j-1))
那么平均查找长度为ASL= 1/n*1*2^0+2*2^1+3*2^2+……+j*2^(j-1))
则经过化简计算,得平均查找长度为:((n+1/n ) *log2(n+1)-1 (其中对数中的2为底数:即log以2为底(n+1)的对数)
注 : 当n很大时 ,可近似为ASL= log2(n+1)-1

其中 1*2^0+2*2^1+3*2^2+……+j*2^(j-1)的求法如下:
设 S = 1*2^0 + 2*2^1+3*2^2 +……+ j*2^(j-1) ,
则 2S = 1*2^1+2*2^2 +……+ (j-1)*2^(j-1) + j*2^j
则 2S - S = -( 2^0 + 2^1 + 2 ^2 + …… + 2 ^(j-1)) + j *2^j
即 S = - (2^j-1)+j*2^j           (这里的j相当于h)
带入化简即可。

四,哈希表

1,哈希表的定义

简单理解:
关键字通过一个特殊的函数进行运算得到新的关键字,并存储
在数组中,这个数组就叫哈希表
官方理解:

 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行
 访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记
 录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散
 列表。

2,哈希表的构造方法

(1)、数字分析法

根据数据的某些数字(比如百位和十位数字)来映射到地址。
在这里插入图片描述

(2)、平方取中法

若关键字比较短,则可先对关键字值求平方,然后取运算结果的中间几位为哈希地址。
在这里插入图片描述

(3)、折叠法

将关键字值分割成位数相同的几个部分,然后取这几部分的叠加和(舍去进位)作为哈希地址。
在这里插入图片描述

(4)、除留余数法

H(key)=key%13
在这里插入图片描述

(5)、直接定址法

直接根据数据的值来映射到地址,比如对数字10、11、12、13…可以将其映射到一块连续的内存中。

(6)、随机数法

选择一个随机函数,取关键字的随机函数值为它的哈希地址。即H(key)=random(key),其中random为随机函数。适用于关键字长度不等时。

五,常见查找的时间复杂度

查找

平均时间复杂度

查找条件

算法描述

顺序查找

O(n)

无序或有序队列

按顺序比较每个元素,直到找到关键字为止

二分查找(折半查找)

O(logn)

有序数组

查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。 如果在某一步骤数组为空,则代表找不到。

二叉排序树查找

O(logn)

二叉排序树

在二叉查找树b中查找x的过程为:

1. 若b是空树,则搜索失败

2. 若x等于b的根节点的数据域之值,则查找成功;

3. 若x小于b的根节点的数据域之值,则搜索左子树

4. 查找右子树。

哈希表法(散列表)

O(1)

先创建哈希表(散列表)

根据键值方式(Key value)进行查找,通过散列函数,定位数据元素。

分块查找

O(logn)

无序或有序队列

将n个数据元素"按块有序"划分为m块(m ≤ n)。

每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……。然后使用二分查找及顺序查找。

六, 常见排序时间复杂度

排序法

最差时间分析

平均时间复杂度

稳定度

空间复杂度

冒泡排序

O(n2)

O(n2)

稳定

O(1)

插入排序

O(n2)

O(n2)

稳定

O(1)

选择排序

O(n2)

O(n2)

稳定

O(1)

二叉树排序

O(n2)

O(n*log2n)

不一顶

O(n)

快速排序

O(n2)

O(n*log2n)

不稳定

O(log2n)~O(n)

堆排序

O(n*log2n)

O(n*log2n)

不稳定

O(1)

希尔排序

O

O

不稳定

O(1)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值