算法及时间/空间复杂度的分析
算法(Algorithm)
对特定问题求解步骤的一种描述,是为解决一个或一类问题给出的一个确定的、有限长的操作序列
算法的基本特征
①输入:有零个或多个输入
②输出:有一个或多个输出
③有穷性:在执行有穷步之后结束,且每一步都在有穷时间内完成
④确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出
⑥可行性:算法描述的操作可以通过已经实现的基本操作执行有限次完成
有效算法五大特征
①正确性:能满足具体问题的需求,对于任何合法的输入,算法都会得出正确的结果
②健壮性:对非法输入的抵抗能力,即对于错误的输入,算法应能识别并做出相应处理,而不是产生错误结果或陷入瘫痪
③可读性:容易理解和实现
④时间效率高:运行时间短
⑤空间效率高:占用的存储空间尽量少
算法的描述方法(以欧几里得算法为例)
①自然语言
②程序流程图
③伪代码
④程序设计语言
时间复杂度
渐进复杂度分析
①算法的运行时间是问题规模n的函数,记作T(n)
②用基本语句的执行次数表示T(n)
③忽略低阶项和常系数,只考虑最高阶
④用大O、大Ω和大Θ表示其渐近意义下的阶
分析算法时间复杂度的一般步骤
渐进上界(O)
如果存在两个正的常数c和n0:
对于任意n≥n0,都有f(n)≤c×g(n),则称f(n)=O(g(n)),即g(n)为f(n)的上界
一个算法的运行时间用大O符号表示时,总是采用最有价值的g(n)表示,称之为“紧凑上界”或“紧确上界”
一般地,如果f(n)=amnm+am-1nm-1+…+a1n+a0,有f(n)=O(nm)
渐进下界(Ω)
若存在两个正的常数c 和n0:
对于任意n≥n0,都有f(n)≥c×g(n),则称f(n)=Ω(g(n)),即g(n)为f(n)的下界
一个算法的运行时间用大Ω符号表示时,总是采用最有价值的g(n)表示,称之为“紧凑下界”或“紧确下界”
一般地,如果f(n)=amnm+am-1nm-1+…+a1n+a0,有f(n)=Ω(nm)
渐进紧界(Θ)
若存在三个正的常数c1、c2和n0:
对于任意n≥n0都有c1×g(n)≥f(n)≥c2×g(n),则称f(n)=(g(n)),即g(n)与f(n)同阶
f(n)=Θ(g(n)),当且仅当f(n)=O(g(n)),f(n)=Ω(g(n))
一般地,如果f(n)=amnm+am-1nm-1+…+a1n+a0,有f(n)=Θ(nm)
常见复杂度的大小
类型 | 顺序 |
---|---|
多项式阶算法(有效算法) | T(n)=O(nk) |
常见的多项式阶大小排序 | O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3) |
指数阶算法 | T(n)= Ω(an),a>1 |
常见的指数阶大小排序 | O(2n)<O(n!)<O(nn) |
如图:
运行时间表:
渐进时间复杂度分析的一般步骤
①决定用哪个或哪些参数作为算法规模问题的度量
②找出算法中的基本语句(循环体)
③检查基本语句的执行次数是否依赖于其它影响(如排序问题中原序,可分为最好、最坏和平均)
④建立基本语句执行次数的求和表达式
⑤使用渐进符号O表示算法增长率的上限
Ps:通常只求最坏情况运行时间,因为
给出了任何输入的运行时间的上界;对某些算法,最坏情况经常出现;“平均情况”往往与最坏情况一样差
空间复杂度
一个算法的存储量包括形参所占空间和临时变量所占空间。在对算法进行存储空间分析时,只考察临时变量所占空间
渐进空间复杂度
同时间复杂度,S(n) = O(n)、Ω(n)、Θ(n)
原地工作
如果算法所需的辅助空间相对于问题的输入规模来说是一个常数,我们称此算法为原地(或就地)工作,即S(n) = O(1)
递归
对于递归函数的,需要空间(栈)来存储每一层的数据,因此空间复杂度并不为O(1)
递归方程及其求解方法
递归方程
①递归方程是一个等式或不等式,它通过更小的输入上的函数值来描述一个函数
②当一个算法包含对其自身的递归调用时,可以用递归方程来表示其运行时间
1)、迭代法
从初始递归方程开始,反复用递归方程右边的等式代入左边的函数,直到得到初值
例,求解:
T(n) = O(1) 当n=1时
T(n) = 2T(n/2)+ O(n) 当n>1时
2)、代入法
①猜测解的形式
②用数学归纳法进行验证
3)、递归树法
以树的形式来展开一个递归算法的模型:
递归树是一棵结点带权值的树,每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用
①递归树的构造
初始的递归树只有一个结点,它的权标记为T(n);然后按照递归树的迭代规则不断进行迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点
②递归树的求解
将树中每层中的代价求和,得到每层代价,再将所有层的代价求和,得到总的递归调用代价
例,求解:T(n)=2T(n/2)+O(n)
对于不平衡的递归树:T(n)=T(n/3)+T(2n/3)+n
设从根结点到最长路径的层数为:k
则n*(2/3)k = 1,解得 k = log3/2n
得出时间复杂度为:
4)、主方法
适用于求解:
T(n)=aT(n/b)+f(n) a≥1,b>1为常数,f(n)为渐近正函数
对原始方程进行解析:
分为三种情况:
算法及时间/空间复杂度的分析相关推荐
- 数据结构与算法的时间空间复杂度
提到数据结构与算法就不得不提时间复杂度和空间复杂度,本人看大部分文章介绍都比较晦涩难懂,就想着用简单的代码示例快速让你理解数据结构与算法的时间空间复杂度. 首先,时间复杂度表示的是使用某个数据结构或者 ...
- Algorithm Master Road:算法的时间/空间复杂度
很多同学都觉得算法很难,难以入门,难以理解,更难以掌握和运用,其实归根溯源,我们可以把所有的问题都通过枚举法来解决,但是受困于「时间」和「空间」的因素,有的时候并不能枚举所有的情况,所以需要通过精妙的 ...
- c++算法——算法章节-时间空间复杂度
算法开章咯 这次是csp-j组算法 枚举法 hash vector 结构体 queue stack 贪心-简单 贪心区间 递归 二分 set map 二叉树 图的遍历-邻接矩阵 迷宫问题-dfs-深度 ...
- 算法设计与分析课程的时间空间复杂度
算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...
- 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序
简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...
- a*算法的时间复杂度_数据结构与算法系列——时间、空间复杂度
数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...
- 一层循环时间复杂度_数据结构与算法系列——时间、空间复杂度
数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...
- 【算法】时间和空间复杂度
文章目录 前言 一.时间复杂度 二.空间复杂度 三.常见的案例和示例 1. 线性查找(Linear Search) 2. 快速排序(Quick Sort) 3.动态规划(Dynamic Program ...
- 时间/空间复杂度及常用算法的复杂度比较
目录 1.什么是复杂度 2.什么是时间/空间复杂度 时间复杂度: 空间复杂度(Space Complexity): 3.常用的排序/算法复杂度比较 我们在做数据库相关的东西时,经常谈到一个概念叫复杂度 ...
最新文章
- 在 DW 中插入 Flash 的参数详解
- 美赛开赛在即,你准备好了吗?
- django-视图中的request对象的属性
- (07)VHDL实现闪灯
- 正则 (?i,m,s,x,g)
- ubuntu18.04 安装惠普打印机驱动和GUI界面
- 易语言解析html实例,易语言解析JSON教程
- 春运12306购票指南
- android+世界地图高清版大图片,世界地图全图高清版
- hdoj小数转化为分数
- stm32f103c6t6制作音乐频谱分析仪
- 动态规划挖金矿问题——python实现
- 奖券数目2.1题目描述有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是N位数,要求其中不要出现带
- oracle sparc 服务器系统,oracle sparc服务器基础及管理.pdf
- 2008欧锦赛 球员名单 C组
- js实现省市区三级联动
- Android开发者账号申请注册及上传
- 【TB-02模组专题②】学习如何对接天猫精灵语音控制的过程;
- 智能物流系统领域国内外的发展状况及趋
- 谈h站与假高权重站的操作与盈利模式
热门文章
- crontab -e 报错(E518: Unknown option: foldenable)
- 深入理解设计模式(22):享元模式
- java Set无序集合 HashSet 的对象元素唯一性
- C语言 判断两个字符串大小相等关系
- 数据结构函与算法之函数与递归
- PrismJS,一款漂亮的代码高亮工具
- C#LeetCode刷题之#653-两数之和 IV - 输入 BST(Two Sum IV - Input is a BST)
- python交换两个变量的值
- 从安装到部署的Cordova iOS应用开发说明
- python实现一个简单的项目_Python小项目四:实现简单的web服务器