常用算法和复杂度总结

简介: 一、常用算法和复杂度 算法 名称 复杂度 备注 快速排序 QuickSort(A,p,r) 最坏:O(n2) 平均:O(nlog n) 均衡划分:O(nlog n) ...

一、常用算法和复杂度

算法

名称

复杂度

备注

快速排序

QuickSort(A,p,r)

最坏:O(n2)

平均:O(nlog n)

均衡划分:O(nlog n)

 

合并排序

MergeSort(A,p,r)

O(nlog n)

 

选最大

FindMax

O(n)

 

选最大和最小

FindMaxMin

W(n)=3n/2-2=O(n)

 

找第二大

锦标赛法

n+logn-2

 

选择第k

Select

O(n)

 

动态规划:矩阵连乘

MatrixChain(P,n)

递归:O(2n)

非递归:O(n3)

 

动态规划:投资问题

 

O(nm2)

m元钱投资n个项目

动态规划:背包问题

 

 

目标函数、约束条件、递推方程

动态规划:最长公共子序列

LCS_length(X,Y)

LCS(B,i,j)

W(mn)=O(mn)

S(mn)=O(mn)

 

动态规划:图像压缩

Compress(P,n)

T(n)=O(n)

 

动态规划:最大子段和

 

顺序:O(n3)

分支策略:O(nlog n)

动态规划:O(n)

 

动态规划:凸多边形的三角划分

 

时间O(n3),空间O(n2)

 

动态规划:电路布线

MNS(C,n)

T(n)=O(n2)S(n)=O(n2)

 

动态规划:最优二叉搜索树

 

T(n)=O(n2)S(n)=O(n2)

 

贪心法:活动选择问题

Greedy Select

 

 

贪心法:最优装载问题

Loading

O(nlogn)

 

贪心法:最小延迟调度问题

 

O(n)

 

贪心法:找零钱问题

 

 

 

贪心法:装箱问题

 

 

 

贪心法:最优二元前缀码问题

HuffmanC

O(nlogn)

 

贪心法:文件归并

Huffman算法

O(nlogn)

 

贪心法:最小生成树

kruskal算法

O(nlogn)

 

贪心法:单源最短路径

Dijkstra算法

O(n2)

 

回溯法:四后问题

递归回溯,迭代回溯

四叉树,深度优先

指数级,蒙特卡罗法估计效率

 

回溯法:最有装载问题二

子集数,深度优先

指数级

 

分支估界:背包问题

代价函数,深度优先

           

 

分支估界:最大团问题

子集树

代价函数:F=Cn+n-k

约束条件

O(n2n)

 

回溯法:图的m着色问题

 

O(nmn)

 

分支估界:巡回售货员问题

 

O(n!)

 

分支估界:圆排列问题

 

O((n+1)!)

 

分支估界:电路板排列问题

 

O(mn!)

 

分支估界:连续邮资问题

 

指数级

 

 

二、动态规划算法

设计步骤:

1)  将问题表示成多步判断

2)  确定是否满足优化原则---必要条件

3)  确定子问题的重叠性---估计算法效率

4)  列出关于优化函数的递推方程(或不等式)和边界条件

5)  自底向上计算子问题的优化函数值---非递归的算法

6)  备忘录方法记录中间结果

7)  标记函数追踪问题的解

问题:

1)  时间复杂性改进依赖于子问题的重叠程度

2)  空间复杂度较高

 

三、贪心算法

设计要素:

       1)适用于满足优化原则的组合优化问题

       2)将问题表示成多步判断

       3)确定一个优化测度---贪心选择的依据

       4)确定是否满足贪心选择性质---每步贪心选择都会导致最优解

       5)自顶向下计算

贪心算法正确性的证明思路:

数学归纳法,叙述一个可以归纳证明的命题,并证明。

1)  对步数k归纳

对于任意kk步贪心选择得到i1i2ik,那么存在最优解包含i1i2,。。。,ik

2)  规模k归纳

对于任意k,贪心法得到关于规模为k的问题的最优解。

四、回溯法和分支估界法

适用于求解组合搜索和优化问题

求解条件:满足多米诺性质

解的表示:解向量,求解是不断扩充解向量的过程

回溯条件:

       搜索问题---约束条件

       优化问题---约束条件+代价函数

算法复杂性:

       遍历搜索树的时间,最坏情况为指数,空间代价小

平均时间复杂性的估计:Monte Carlo方法

降低时间复杂性的主要途径:

       利用对称性裁剪子树

       划分成子问题

分支策略

       深度优先、宽度有限、宽深结合、优先函数

 

五、求解组合优化问题的算法设计技术比较

 

 

 

目录
相关文章
|
6月前
|
机器学习/深度学习 存储 算法
【算法与数据结构】复杂度深度解析(超详解)
【算法与数据结构】复杂度深度解析(超详解)
【算法与数据结构】复杂度深度解析(超详解)
|
6月前
|
存储 算法
数据结构与算法:复杂度
数据结构: 数据结构是用于存储和组织数据的方式,以便可以有效地访问和修改数据。不同的数据结构适用于不同类型的应用,并且具体的数据结构可以大幅影响程序的性能。数据结构分为两大类:线性数据结构和非线性数据结构。 算法: 算法是完成特定任务的一系列操作步骤,是解决问题的明确规范。算法的效率通常通过时间复杂度和空间复杂度来评估,即算法执行所需的时间和空间资源。
|
6月前
|
机器学习/深度学习 存储 算法
如何评判算法好坏?复杂度深度解析
如何评判算法好坏?复杂度深度解析
110 0
|
5月前
|
机器学习/深度学习 存储 算法
1 .算法的复杂度(超全)
1 .算法的复杂度(超全)
|
30天前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
21 0
|
2月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
54 4
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
41 1
|
3月前
|
算法
【初阶数据结构】复杂度算法题篇
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部 kmodn 个元素会移动至数组头部,其余元素向后移动 kmodn 个位置。
26 1
|
4月前
|
机器学习/深度学习 存储 算法
【数据结构】算法的复杂度
算法的时间复杂度和空间复杂度
72 1
【数据结构】算法的复杂度