数据结构小总结


差不多把数据结构里面的主要算法都写了,写一个概要吧。


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,图

最近写的
邻接矩阵  邻接表  拓扑排序 最小生成树 等等


posted @ 2011-05-25 22:30  jinmengzhe  阅读(654)  评论(0编辑  收藏  举报