数据结构之大体脉络(二)
来源:互联网 发布:淘宝保证金必须要交吗 编辑:程序博客网 时间:2024/05/21 14:01
今天来总结下查找和内部排序
查找
静态查找:不改变查找表中的内容。
动态查找:对表中数据元素进行插入或删除。
1.顺序表的静态查找
(1)顺序查找
方法:将关键字放入0号单元,查找方向从n到1,逐个进行元素的关键字和给定值的比较
时间复杂度:O(n)
(2)折半查找(二分查找)
方法:假设为升序表,先确定查找区域,将关键字与该区域的中间元素的关键字进行比较,若小于则对左区域的
再选择中间元素与之比较,直到查找成功或该区域中只剩一个元素;反之亦然。
注:前提条件必须是有序表,可以画折半查找树。
时间复杂度:O(log?n)
(3)分块查找
分块查找概念:将查找表分成若干个子表,块内数据元素无序,但块与块之间是有序的,并对块建立索引表。
方法:用给定的关键字在索引表中检测索引项,确定待查记录所在块;在块中顺序查找。
分块查找适用于对大型数据的查找
2.树表的动态查找
1.二叉排序树(二叉查找树)
性质:(1)若左子树不空,则左子树上的所有结点的值均小于根结点的值
(2)若右子树不空,则左子树上的所有结点的值均大于根结点的值
(3)左右子树也是二叉排序树
注:对二叉排序树进行中序遍历可得到有序序列。
查找:(1)判断查找树是否为空,如为空,则查找失败,否则进行下一步。
(2)若关键字等于根结点的值,则查找成功;若小于,则查找左子树;若大于,则在右子树上继续查找。
插入和构造:按上述性质可得到。
2.平衡二叉树
性质:(1)若不为空树,左子树和右子树的深度差的绝对值小于等于1;
(2)左子树和右子树都是平衡二叉树。
构造:对失去平衡的调整有LL型,RR型,LR型,RL型四种
(1)LL型:进行右单旋转,如
静态查找:不改变查找表中的内容。
动态查找:对表中数据元素进行插入或删除。
1.顺序表的静态查找
(1)顺序查找
方法:将关键字放入0号单元,查找方向从n到1,逐个进行元素的关键字和给定值的比较
时间复杂度:O(n)
(2)折半查找(二分查找)
方法:假设为升序表,先确定查找区域,将关键字与该区域的中间元素的关键字进行比较,若小于则对左区域的
再选择中间元素与之比较,直到查找成功或该区域中只剩一个元素;反之亦然。
注:前提条件必须是有序表,可以画折半查找树。
时间复杂度:O(log?n)
(3)分块查找
分块查找概念:将查找表分成若干个子表,块内数据元素无序,但块与块之间是有序的,并对块建立索引表。
方法:用给定的关键字在索引表中检测索引项,确定待查记录所在块;在块中顺序查找。
分块查找适用于对大型数据的查找
2.树表的动态查找
1.二叉排序树(二叉查找树)
性质:(1)若左子树不空,则左子树上的所有结点的值均小于根结点的值
(2)若右子树不空,则左子树上的所有结点的值均大于根结点的值
(3)左右子树也是二叉排序树
注:对二叉排序树进行中序遍历可得到有序序列。
查找:(1)判断查找树是否为空,如为空,则查找失败,否则进行下一步。
(2)若关键字等于根结点的值,则查找成功;若小于,则查找左子树;若大于,则在右子树上继续查找。
插入和构造:按上述性质可得到。
2.平衡二叉树
性质:(1)若不为空树,左子树和右子树的深度差的绝对值小于等于1;
(2)左子树和右子树都是平衡二叉树。
构造:对失去平衡的调整有LL型,RR型,LR型,RL型四种
(1)LL型:进行右单旋转,如
(2)RR型:进行左单旋转,和LL型方法类似,只不过方向不同
(3)LR型:先左后右旋转,如
(3)LR型:先左后右旋转,如
(4)RL型:先右后左旋转
3.B-树(平衡因子等于0)
B-树是一种平衡查找树,适合在磁盘等直接存储设备上组织动态的查找表(只适合随机查找)
对于m(m>=3)阶B-树
性质:(1)树中每个结点至多有m课子树
(2)若根结点不是叶子结点,则至少有两颗子树
(3)除根结点的所有非终端结点至少有【m/2】颗子树,取上限
(4)每个非终端结点包含,(关键字个数,指针,关键子,指针...)
(5)所有的叶子结点在同一层上
插入和生成:从底向上生成的,如序列{5,19,21,56,38,13,52}
4.B+树
对于m(m>=3)阶B+树
性质:(1)树中每个结点至多有m课子树
(2)若根结点不是叶子结点,则至少有两颗子树
(3)除根结点的所有非终端结点至少有【m/2】颗子树,取上限
(4)每个非终端结点包含,(关键字个数,指针,关键子,指针...)
(5)所有的叶子结点包含全部关键字及指向相应记录的指针,而且叶结点的本身按关键字的由小到大顺序链接。
注:B+树可以容纳更多的条目,它同时支持随机查找和顺序查找,更适合文件索引系统。
3.散列(Hash)表查找
概念:使用H函数计算关键字的地址。
构造散列函数时需要解决两个问题:
(1)构造好的散列函数。所选散列函数对关键字的散列地址,应在散列表集中,大致均匀的分布,减少冲突和空间
浪费;所选函数尽可能的简单提高计算速度。
(2)制定处理冲突的方法。
构造方法:最常用的为除留余数法,即对于表长为m,H(key)=key%p(p<=m)
注:该方法的关键在于选择合适的p,一般来说,p 取质数,最好是小于等于m的最大质数。
处理冲突的方法:
1.开放定址法Hi(key)=(H(key)+di+m)%m
(1)线性探测法
di=i(i=1,2...m-1)
Hi(key)=(H(key)+i)%m
(2)二次探测法
di=12,-12,22,-22,...k2,-k2(k<=m/2)
(3)双重散列探测法
使用两个散列函数
2.再散列法
Hi(key)=RHi(key)(i=1,2,...k)
3.链地址法(拉链法)
4.建立一个公共的溢出域
内部排序
插入排序
1.直接插入排序
基本思想:每次将一个待排序的数据元素(或记录),按关键码大小插入到前面已经排好序的子序列中,并使子序列
保持有序,直到全部记录插入完成为止。
性能分析
(1)最好情况
比较次数:Σ1=n-1 i[2,n]
移动次数:Σ2=2(n-1) i[2,n]
(2)最坏情况
比较次数:Σi=1/2(n+2)(n-1) i[2,n]
移动次数:Σ(i+1)=1/2(n+4)(n-1) i[2,n]
(3)平均情况
比较次数和移动次数:i/2
最好和最坏情况下的时间复杂度为O(n2)
(4)稳定性:稳定
2.折半插入排序
基本思想:其基本操作仍是将有序部分插入一个记录,采用折半法确定插入位置,并在位置确定后将该位置之后的元
素依次后后移。
注:折半插入排序只顺序存储序列。
性能分析
(1)时间性能分析
比较次数:O(nlog?n)
移动次数;O(n2)
(2)空间性能分析
s(n)=O(1)
(3)稳定性:稳定
3.希尔排序
基本步骤:
(1)按选定的距离分组,假设相邻的两个元素距离为1,将彼此指定距离的元素划为一组,初始时选定一个适当的距
离d1;
(2)在每组内进行插入排序
(3)修改距离,选一个小于d1的距离d2;
(4)重复以上三个步骤的分组和排序,直到di=1,即所有的记录成为一组为止。
注:尽量避免增量序列的值互为倍数;增量序列中的最后一个增量必须为1.
(1)时间性能分析
最好情况:O(n)
最坏情况:O(n2)
(2)空间性能分析
s(n)=O(1)
(3)稳定性:不稳定
插入排序
1.直接插入排序
基本思想:每次将一个待排序的数据元素(或记录),按关键码大小插入到前面已经排好序的子序列中,并使子序列
保持有序,直到全部记录插入完成为止。
性能分析
(1)最好情况
比较次数:Σ1=n-1 i[2,n]
移动次数:Σ2=2(n-1) i[2,n]
(2)最坏情况
比较次数:Σi=1/2(n+2)(n-1) i[2,n]
移动次数:Σ(i+1)=1/2(n+4)(n-1) i[2,n]
(3)平均情况
比较次数和移动次数:i/2
最好和最坏情况下的时间复杂度为O(n2)
(4)稳定性:稳定
2.折半插入排序
基本思想:其基本操作仍是将有序部分插入一个记录,采用折半法确定插入位置,并在位置确定后将该位置之后的元
素依次后后移。
注:折半插入排序只顺序存储序列。
性能分析
(1)时间性能分析
比较次数:O(nlog?n)
移动次数;O(n2)
(2)空间性能分析
s(n)=O(1)
(3)稳定性:稳定
3.希尔排序
基本步骤:
(1)按选定的距离分组,假设相邻的两个元素距离为1,将彼此指定距离的元素划为一组,初始时选定一个适当的距
离d1;
(2)在每组内进行插入排序
(3)修改距离,选一个小于d1的距离d2;
(4)重复以上三个步骤的分组和排序,直到di=1,即所有的记录成为一组为止。
注:尽量避免增量序列的值互为倍数;增量序列中的最后一个增量必须为1.
(1)时间性能分析
最好情况:O(n)
最坏情况:O(n2)
(2)空间性能分析
s(n)=O(1)
(3)稳定性:不稳定
交换排序
1.冒泡排序
基本思想:基于相邻记录的两两比较,通过交换让关键码小的的记录向上浮(前移),关键码大的记录向下沉(后移)。
性能分析
(1)最好情况
比较次数:n-1
交换次数:0
(2)最坏情况
比较次数:Σ(n-i)=?n(n-1) i[2,n]
移动次数:Σ(n-i)=?n(n-1) i[2,n]
(3)平均情况
最坏的平均时间复杂度O(n2)
(4)空间性能分析
s(n)=O(1)
(5)稳定性:稳定
2.快速排序
基本思路:其核心操作是划分,它对序列的划分不是随意进行而是尽量将原序列划分为两半。
基本步骤:
(1)一般选择首元素作为轴值,分别设置两个指针i,j,指向首尾
(2)从末尾元素开始,和轴值比较,若大于轴值,则执行减1操作;若小于轴值,则将该记录存放在i处,i++;
(3)从i进行右侧扫描,若小于轴值,则i++;否则将记录存放在j出,j--;
(4)重复(2)(3)步骤,直到每组记录为一个为止。
例如:49,38,65,97,76,13,27,65
以49为轴值:【27,38,13】49【76,97,65,65】
分别以27,76为轴值:13,27,38,49【65,65】76,97
以65为轴值:13,27,38,49,65,65,76,97
性能分析
(1)最好情况
O(nlog?n)
(2)最坏情况
O(n2)
(3)平均情况
O(nlog?n)
(4)空间性能分析
s(n)=O(log?n)
(5)稳定性:不稳定
选择排序(移动次数少)
1.直接选择排序
基本思路:在序列中选择最小的和第一个交换,在除第一个之外的中选择最小的和第二个交换,以此类推。
性能分析
(1)最好情况
O(n2)
(2)最坏情况
O(n2)
(3)平均情况
O(n2)
(4)空间性能分析
s(n)=O(1)
(5)稳定性:稳定
2.堆排序
堆:设有n个元素的序列{k1,k2...kn},当且仅当满足下属关系之一时称为堆。
(1)ki<=k2i,ki<=k2i+1或(2)ki>=2i;ki>=2i+1 (i=1,2...n/2)
前者为大顶堆。后者为小顶堆。
堆排序基本思路:如小顶堆,输出根结点,将最后一个元素调整到根结点,与左右结点比较,与最小的交换直到
满足堆为止,重复此操作,直到与最后一个交换。
性能分析
(1)最好情况
O(nlog?n)
(2)最坏情况
O(nlog?n)
(3)平均情况
O(nlog?n)
(4)空间性能分析
s(n)=O(1)
(5)稳定性:不稳定
3.归并排序
归并排序一般分为2-路归并(内部排序),多路归并(一般用于外部磁盘数据排序)。
2-路归并递归排序:先将子序列划分为两个子序列,再将子序列划分为两个子序列,直到序列中只有一个元素,
在将这些序列两两排序合并,最后为有序序列。
性能分析
(1)最好情况
O(nlog?n)
(2)最坏情况
O(nlog?n)
(3)平均情况
O(nlog?n)
(4)空间性能分析
s(n)=O(n)
(5)稳定性:稳定
4.基数排序
更多内容请看上篇http://blog.csdn.net/jingmo4129/article/details/52811162
0 0
- 数据结构之大体脉络(二)
- 数据结构之大体脉络总结(一)
- (学习笔记)数据结构大体回顾
- 理清互联网金融的脉络(二)
- react + redux大体思路(二)
- 校园网&openwrt记(二)应用的大体设计
- 数据结构之二(hash)
- 数据结构之栈(二)
- 数据结构之单链表(二)
- 数据结构之栈(二)
- 数据结构之队列(二)
- 数据结构之排序(二)
- 二、rabbitMQ大体框架简介
- 数据结构之:treap 简介(二)
- 数据结构之线性结构(单链表)【二】
- 数据结构之二(续,高级hash)
- 学习笔记--数据结构(之二)队列
- 数据结构(二)之栈ADT
- centos安装ngnix服务器
- MyBatis学习总结(七)——Mybatis缓存
- html项目开发过程中遇到的问题(1)
- Javascript深浅拷贝
- 判断鼠标移入移出元素时的方向
- 数据结构之大体脉络(二)
- NGUI 制作动态图集
- leetCode练习(77)
- java Thread学习(新类库CountDownLatch+CyclicBarrier+DelayQueue)
- PyQt学习笔记(8)--QSplitter分割窗口
- 第八周 【项目二 建立链串的算法库】
- Mix-Editor图文编辑器----Android图文编辑器
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- Linux的.desktop文件格式及常用属性