目录 :
一,顺序查找
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) |