算法设计与分析

目录

三个渐进记号 

分治策略

①迭代法

②递归树法

③主定理法

分治的应用

堆应用

动态规划

        动态规划应用

贪心算法

贪心算法应用

回溯法

回溯法应用

图的遍历

BFS

DFS 记录时间戳

拓扑排序

强连通分量

最小生成树

流网络

NP、P

摊还分析


三个渐进记号 

f(n)=O(g(n))其实是代表f(n)∈O(g(n))
渐近上界记号O

O(g(n)) = { f(n) : 存在正常量cn0,使得对所有nn0,有0 ≤ f(n) ≤ cg(n)}

渐近下界记号 Ω

Ω(g(n)) = { f(n) :存在正常量 c n0,使得对所有 n³ n0 有 0 ≤ cg(n) ≤ f(n) for all nn0 }

渐近紧确界记号Θ

Θ(g(n)) = { f(n) : 存在正常量c1, c2和n0,使得对所有nn0,有0 ≤ c1 g(n) ≤ f(n) ≤ c2 g(n)}

分治策略

将一个问题分解为与原问题相似但规模更小的若干子问题,递归地解这些子问题,然后将这些子问题的解结合起来构成原问题的解。这种方法在每层递归上均包括三个步骤:
Divide (分解):将问题划分为若干个子问题
Conquer (求解):递归地解这些子问题;若子问题 Size 足够小,则直接解决之
Combine (组合):将子问题的解结合成原问题的解

①迭代法

算法设计与分析_第1张图片

②递归树法

算法设计与分析_第2张图片

每个节点标注的是合并代价,然后把每一行的加起来,要算一下总共有多少层。

③主定理法

主方法可解如下形式的递归式

T(n) = aT(n/b) + f(n)

算法设计与分析_第3张图片

关键是看 f(n) nlogba 谁比较大。

Case 1 成立,如果 nlogba 较大 ,那么T(n) = Θ(nlogba ).

Case 2 (k = 0) 成立,如果 f(n) nlogba 大小相当。T(n) = Θ(f(n)lgn).

        一般来说, f(n) nlogba lgkn 大小相当 ,T(n) = Θ(f(n) lgk+1n).

Case 3 成立,如果 f(n) is 较大 è T(n) = Θ(f(n)).

分治的应用

最大子数组

矩阵乘法Strassen

凸包问题

棋盘覆盖问题

二维最近点对问题

二叉树
根深度为0,叶子高度为0.
满二叉树
算法设计与分析_第4张图片
完全二叉树(右下角可以缺一些)
算法设计与分析_第5张图片
有两种说法,一种是全满的叫满二叉树,右下角缺一点的叫完全二叉树。另一种是全满的叫完全二叉树,右下角缺一点的叫近似完全二叉树。
堆就是一个完全二叉树。用数组来存堆,下标从1开始。
建堆的效率O(n),堆化的效率O(lgn),推排序的效率O(nlgn)

堆应用

TopK问题
Prime算法
huffman编码

动态规划

        动态规划主要用于求解以阶段划分的动态过程的优化问题。

        最优子结构,用反证法证问题的最优解是由其子问题的最优解来构造,则称该问题具有最          优子结构性质。

        动态规划要定义符号,找关系,写出递推公式,记得写边界条件。

        动态规划有最普通的递归,自顶向下带备忘的,自底向上打表的。

        动态规划应用

钢条切割
0-1背包
矩阵链乘
最长公共序列
分段最小二乘
鸡蛋掉落

贪心算法

从问题的某一个初始解出发, 通过一系列的贪心选择 —— 当前状态下的 局部最优 选择,逐步逼近给定的目标 ,尽可能快地求得更好的解。 不一定是最优解。

贪心算法应用

0-1背包
小数背包
找钱问题
活动选择问题

      回溯法

再解空间中搜,可以剪枝,减少搜索空间。

回溯法应用

n皇后问题
装载问题
0-1背包
分数背包
地图填色

图的遍历

BFS

           白色节点示该节点还未被访问

灰色节点表示它被访问过,但是还没有对它的所有邻居进行访问

黑色节点表示它被访问过,而且已经访问了它的所有邻居

算法设计与分析_第6张图片

        

         DFS 记录时间戳

算法设计与分析_第7张图片 算法设计与分析_第8张图片

 算法设计与分析_第9张图片

算法设计与分析_第10张图片

      拓扑排序

        只有有向无环图才可以拓扑排序。

        先选没有入度的点,删了它和它的边,再选没有入度的点。

强连通分量

        先dfs一次,在转置图上,按照时间戳最大的开始dfs,几次dfs就是几个连通分量。

最小生成树

Kruskal和Prim都是贪心算法。
Krusal用并查集, 总的时间复杂度 : O (| E | lg | E |) 或者 O (| E | lg | V |)
算法设计与分析_第11张图片

         prim

                算法设计与分析_第12张图片

         Kruskal稀疏图比较好,Prim稠密图比较好。

        Kruskal算法实现简单一点。

流网络

割的容量:只算S->T的
割的净流:正反的流量都加起来
同一个图,不同割的净流是一样的。 算法设计与分析_第13张图片

NP、P

NP类问题是多项式时间内可以被验证的问题。
P类问题是多项式时间内库解决的问题。
如果问题Q满足两个条件:
①Q是NP问题
②任何NP问题都可以归约到Q
则称:Q为NPC问题。
如果问题H满足NPC条件中的第二条,即满足任何NP问题都可以归约到H,但不一定满足第一条,那么称H是NP-hard问题,简称NPH问题。

摊还分析

合计法、聚合方法( aggregate):计算对所有的 n 个操作序列在最坏情况下的总时间为 T(n) 。因此,最坏情况下每个操作的平摊代价为 T(n)/n
核算法、会计法(accounting :给生活费,给了就不管了。
势能法(potential :不同题目势的定义是不同的。
算法设计与分析_第14张图片

你可能感兴趣的:(算法,学习)