常用算法和复杂度总结

一、常用算法和复杂度


算法


名称


复杂度


备注


快速排序


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)


 


贪心法:找零钱问题


 


 


 


贪心法:装箱问题


 


 


 


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


Huffman(C)


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归纳

对于任意k,k步贪心选择得到i1,i2,…,ik,那么存在最优解包含i1,i2,。。。,ik

2)  规模k归纳

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

四、回溯法和分支估界法

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

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

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

回溯条件:

       搜索问题---约束条件

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

算法复杂性:

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

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

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

       利用对称性裁剪子树

       划分成子问题

分支策略

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

 

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

 

 

 

时间: 2024-10-27 12:39:15

常用算法和复杂度总结的相关文章

计算几何常用算法概览

一.引言 计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题.作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法.在现代工程和数学领域,计算几何在图形学.机器人技术.超大规模集成电路设计和统计等诸多领域有着十分重要的应用.在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助. 二.目录 本文整理的计算几何基本概念和常用算法包括如下内容: 矢量

php 常用算法和时间复杂度

本篇文章是对php中的常用算法以及时间复杂度进行了详细的分析介绍,需要的朋友参考下   按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3) 复制代码 代码如下: //二分查找O(log2n) function erfen($a,$l,$h,$f){ if($l >$h){ return false;} $m = intval(($l+$h)/2); if ($a[$m] == $f){ r

php计算两个整数的最大公约数常用算法小结

 这篇文章主要介绍了php计算两个整数的最大公约数常用算法,实例总结了求最大公约数的三种常用方法,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php计算两个整数的最大公约数常用算法.分享给大家供大家参考.具体如下:   代码如下: <?php //计时,返回秒 function microtime_float () { list( $usec , $sec ) = explode ( " " , microtime ()); return ((float)

fp-spark下运行并行FP-Growth算法当支持度&amp;amp;lt;0.001的时候数组溢出

问题描述 spark下运行并行FP-Growth算法当支持度<0.001的时候数组溢出 做微薄的数据挖掘,支持度需要设置比较小,运行的时候支持度大于0.001没有问题,但是小于的时候会出现数组溢出.报错位置为第二行:val part = res.partition(t1 => tail.exists(t2 => t1._1 == t2)) val p1 = gen(part._1) if (part._2.length == 0) return p1 else return decare

【阿里云大学课程】机器学习入门:概念原理及常用算法

AlaphaGo与围棋界的较量,吸引了全世界的目光,也让大家见识到了机器学习与人工智能技术的强大之处.你是不是也想学机器学习了? 机器学习是人工智能的一个分支.人工智能的研究是从以"推理"为重点到以"知识"为重点,再到以"学习"为重点,一条自然.清晰的脉络.显然,机器学习是实现人工智能的一个途径,即以机器学习为手段解决人工智能中的问题. 在维基百科中,机器学习有下面几种定义: 机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如

JS实现的几个常用算法_javascript技巧

(1)数组去重 原理:定义一个对象obj,然后把数组元素作为obj的属性名,利用属性名是否重复进行判重 var unique = function(arr){ let obj = {}; let newArr = []; arr.forEach(function(x){ if(!obj[x]){ //如果对象中没有该元素对应的属性 obj[x] = true; newArr.push(x); } }); return newArr; } (2)使用快速排序算法对数组进行排序 这里面包括两种效果,

php计算两个整数的最大公约数常用算法小结_php技巧

本文实例讲述了php计算两个整数的最大公约数常用算法.分享给大家供大家参考.具体如下: 复制代码 代码如下: <?php //计时,返回秒 function  microtime_float () {     list( $usec ,  $sec ) =  explode ( " " ,  microtime ());     return ((float) $usec  + (float) $sec ); } /////////////////////////////////

轻松看懂机器学习十大常用算法

通过本篇文章可以对ML的常用算法有个常识性的认识,没有代码,没有复杂的理论推导,就是图解一下,知道这些算法是什么,它们是怎么应用的,例子主要是分类问题. 每个算法都看了好几个视频,挑出讲的最清晰明了有趣的,便于科普. 以后有时间再对单个算法做深入地解析. 今天的算法如下: 决策树 随机森林算法 逻辑回归 SVM 朴素贝叶斯 K最近邻算法 K均值算法 Adaboost 算法 神经网络 马尔可夫 1. 决策树 根据一些 feature 进行分类,每个节点提一个问题,通过判断,将数据分为两类,再继续提

常用算法之分治法与动态规划法

          之所以把这两种算法放到一起,是因为它们都是用来求最优解的问题,与贪心算法是不同的.但是这两种算法又有一些区别,下面来做解释:           分治,即分而治之,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.                           上图用一个例子来解释如下:              当n>1时,想求得T(n),必须知道T(n-1),以此类推,所