数据结构和算法

简单算法时间复杂度分析:

1.大O描述的是算法的运行时间与输入数据的关系

2.渐进时间复杂度,描述的是n趋于无穷时时间复杂度

动态规划:

 

最短路径:

松弛操作:

dijkstra单元最短路径:不能处理图中带有负权边,复杂度O(ELogV)

Bellman-Ford单元最短路径:不能处理带有负权环,可以判断,复杂度O(EV)

拥有负权环的图,不再拥有最短路径

Floyed算法处理无负权环的图,O(V^3)

 

数据结构和算法_第1张图片

最长路径:

最长路径不能有正权环

无权图的最长路径是指数级别的

有权图,不能使用Dijkstra来求最长路径

可以使用BellmanFord

无权图:

主要针对无向有权图

LazyPrim算法

Kruskal算法

图:

有向图,无向图

有权图,无权图

简单图:没有自环边和平行边的图

图的表示方法:邻接矩阵,邻接表

邻接表适用于稀疏图

邻接矩阵适用于稠密图或者完全图

深度遍历复杂度:

稀疏图-邻接表 O(V+E)

稠密图-邻接矩阵O(V^2)

并查集:

目的:解决连接问题。网络中的连接状态,网络是个抽象的概念,用户之间形成的网络。数学中的集合

时间复杂度:并查集的操作,近乎是O(1)

哈希表:

1.哈希表设计充分体现了算法设计领域的经典思想:空间换时间

2.哈希表是时间和空间的均衡

3.哈希函数设计很重要

4.建通过哈希函数得到的索引分布越均匀越好。

哈希函数设计:

1.原则:

  一致性:a=b,hash(a)=hash(b)

   高效性:计算高效

   均匀性:分布均匀

数据结构和算法_第2张图片

  查找表也可以使用平衡树。

  平均每个地址承载的元素多过一定程度,就扩容。

哈希冲突的办法:

1.开放地址发

    线性探测 

    平方探测

     二次哈希

     结论:扩容的负载率选的合适,时间复杂度也是O(1)

2.链地址法

3.Colaecsed Hashing

  综合了链地址法和开放地址法

红黑树:

1.概念:

每个节点或者红色或者黑色

根节点是黑色的

每个叶子节点(最后的空节点)是黑色的

如果一个节点是红色的,那么他的孩子节点都是黑色的

从任意一个节点到叶子节点(最后的空节点),经过的黑色节点是一样的

2.性质:

红黑树是保持“黑平衡”的二叉树

严格意义上,不是平衡二叉树

最大高度:2logn,O(logn)

统计性能好,还有伸展树

字典树:

数据结构和算法_第3张图片

线段树:

使用原因:对于给定区间:更新区间中的一个元素或者一个区间的值。查询区间的最大值,最小值,或者区间的和

是平衡二叉树

数据结构和算法_第4张图片

优先队列:

数据结构和算法_第5张图片

堆:

二叉堆:是一颗完全二叉树,也是平衡二叉树。堆中的某个节点的值总是不大于其父节点的值。最大堆,最小堆。

heapify时间复杂度:

将n个元素插入到空堆中,时间复杂度是logn

heapify时间复杂度是O(n)

集合和映射:

1.集合

   (1)应用:客户统计

                       词汇量统计

数据结构和算法_第6张图片

有序集合的元素具有顺序性(基于搜索树实现)

无序集合的元素具有无序性(基于哈希表实现)

多重集合

2.映射

数据结构和算法_第7张图片

有序映射:键具有顺序性(基于搜索树)

无序映射:键具有无序性(基于哈希表)

多重映射:键可以重复

二分搜索树

1.使用树的原因:天然的组织结构,高效

2.二叉树:(1)具有唯一根节点

                  (2)每个节点最多有两个孩子

                  (3)每个节点做多有一个父节点

                  (4)具有天然的递归结构,每个节点的左子树和右子树都是二叉树

                  (5)一个节点也是二叉树,NULL也是

3.二分搜索树:(1)是二叉树

                         (2)每个节点大于左子树所有节点的值,小于右子树所有节点值

                         (3)元素具有可比较性

                         (6)二分搜索树中序遍历是顺序的

                          (7)二分搜索树的后序遍历可以用来释放内存

4.层序遍历(广度优先遍历):可以更快搜索,用于搜索策略。也可以用于无权图的最短路径

5.二分查找法:对于有序的数列,才能使用二分查找法

递归

1.本质上,将大问题转换为更小同一问题。

2.举例:数组求和

3.代价:函数调用消耗时间+系统调用栈

队列:

1.

链表:

1.优点:真正的动态,不需要处理固定容量的问题。

2.缺点:丧失了随机访问的能力。

3.时间复杂度:增删改查只对头结点来说是o(1),平均是O(n)。

栈:

1.是一种线性数据结构

2.只能从一端添加元素,也只能从一端取出元素。

3.这一端称为栈顶。

4.应用:1.编辑器撤销

              2.程序调用的系统栈

数组:

1.特点:快速查询,最好应用于“索引有语义”的情况

2.时间复杂度:

   增:O(n)

   删:O(n)

   改:已知索引:O(1),未知索引:O(n)

   查:已知索引:O(1),未知索引:O(n)

你可能感兴趣的:(算法,算法,数据结构)