数据结构小总结
差不多把数据结构里面的主要算法都写了,写一个概要吧。
1,数组
有序数组与无序数组的删除,插入,查找操作,时间复杂度,很简单:
2,简单排序
时间复杂度在O(n^2)级别的,虽然都是平方级别的,但也有快慢之分:
一般来说: 插入 > 选择 > 冒泡
冒泡:
不变性:在排序过程中,已排好的那部分(即冒泡到的最终位置就是排序好的最终位置)保持不变,不参与后来的排序
效率:要进行(N-1) + (N-2) +,,,+1 = N(N-1)/2 ,约在N^2 / 2 的比较,假设有一半情况需要交换,则需要N^2 / 4次的交换
选择:
不变性:已选择好的那一段不参与排序,位置选好后就不变
效率:和冒泡一样,进行N(N-1)/2次比较,但它无疑比冒泡快,因为它进行的交换要少得多(想想为什么!因为选择排序只在一趟结束的时候才交换1次)
插入:
不变性:已插入部分局部有序(但不是位置保持不变,跟上面的有区别)
效率:最坏情况下,才1 + 2 + (N-1) = N(N-1)/2 次比较(逆序的时候),平均是N(N-1)/ 4. 元素的移动次数跟比较次数一样。
插入排序是从局部有序向全局有序扩展的过程。
3,栈和队列
栈和队列作为一种工具,就是提供了受限访问的功能。
入栈出栈,进队出队时间复杂度均为O(1)
循环队列--已经写过
双端队列---在两头进行删除和插入
优先级队列---优先级队列是指在普通队列的基础上,给队列中的元素增加了优先级属性(也可以看做是有序属性)的队列,显然,进队就要插入到适合的位置,而不是队尾,出队永远是出对头最小(可以说是优先级最高)的元素。用数组或者链式实现插入需要O(N)时间,删除O(1)时间。
在学了堆以后,可以用堆来实现优先级队列,堆排序等等。
4,链表
单链表:只在表头记录first指针
双端链表:在表尾再记录一个last指针。
用链表实现栈,用链表实现队列。---数据类型和抽象!!!
有序链表(也可以用来实现优先级队列)
双向链表
实现都复杂度分析都不难,不一一列举
5,递归
任何一个使用递归的程序都可以转化成一个使用栈的程序,然而,在实践中,人们往往从一开始就思考基于栈的算法,而不是从递归转化。
通常情况下,递归的方法,或是使用栈,或者是一个循环,哪个更有效就使用哪个
6,高级排序
shell排序:
对插入排序的改进,插入排序复制的次数太多(元素往后移动)
n-增量排序,shell排序通过增加插入排序时候的间隔,来进行插入排序,
减小间隔,知道间隔为1,完成shell排序,每次间隔的关系可以通过h = 3 * h + 1来变化,当然也可以选择其他的变化方式
效率:除了在一些特殊的情况下,目前还没有人能在理论上去分析shell排序的复杂度,有各种基于实验的评估估计在O(N^1.5)左右。
快速排序:
目前发现的最快的排序方法,可以递归实现
效率:O(N*logN),对逆序数组排序,会降到O(N^2)
归并排序:
O(N*logN) 可以递归实现
基数排序(桶排序),一个很有意思的排序方法,还没有去写,有时间写一下
7,二叉树
二叉查找树里的查找,删除,插入都是log(n)级别的,easy
用二叉排序树来实现有序链表
8,堆
效率分析:
插入:logn
删除最小值:logn,注意删除只要一下,这个logn是后续的调整
堆排序:删除一个是logn,连续删除n个(对n个数排序)为nlogn
9,图
最近写的
邻接矩阵 邻接表 拓扑排序 最小生成树 等等