算法:算法概述【时间复杂度、空间复杂度】
一、算法定义
算法:为了实现业务目的的各种方法和思路就是算法。同样的数据,同样的目的, 不同的算法,不同的方法和思路,效率就会不同
算法是一种独立的存在 , 它并不依附于代码 , 代码只是实现算法思想的方式而已。
算法是独立存在的一种解决问题的方法和思想
对于算法而言,实现的语言并不重要,重要的是思想
算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等)
二、算法的五大特性
- 输入: 算法具有0个或多个输入
- 输出: 算法至少有1个或多个输出
- 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
- 确定性:算法中的每一步都有确定的含义,不会出现二义性
- 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成
三、算法优劣的衡量:时间复杂度、空间复杂度
当我们说算法A的效率高于算法B,指的是 “时间复杂度” 的比较。
1. 时间复杂度
一个算法的实际运行时间很难评估,当时的输入、CPU主频、内存、数据传输速度、是否有其他程序在抢占资源等等,这些因素都会影响算法的实际运行时间。
为了公平地对比不同算法的效率,需要脱离开这些物理条件,抽象出一个数学描述。在所有这些因素中,问题的规模往往是决定算法时间的最主要因素。因此,定义算法的时间复杂度 T ( n ) T(n) T(n),用来描述算法的执行时间随着输入规模的增长将如何变化,增长速度是怎样的。
在输入规模较小时,运行时间本来就少,不同算法的差异不大。所以,时间复杂度通常关注的是输入规模n较大时运行时间的变化趋势,称之为渐进复杂度,采用大O记号。
如果A算法的时间复杂度优于算法B的时间复杂度,那么存在一个足够大的数M,当n>M时,可以保证算法A的实际效率优于算法B的实际效率。
1.1 大O表示法
时间复杂度可以表示一个算法随着问题规模不断变化的最主要趋势 , 同时时间复杂度往往和大O表示法一起使用
1.2 时间复杂度的计算规则
- 基本操作,认为其时间复杂度为O(1)
- 顺序结构,时间复杂度按加法进行计算
- 循环结构,时间复杂度按乘法进行计算
- 分支结构,时间复杂度取最大值
- 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略
- 在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度
1.3 最优、最坏时间复杂度
分析算法时,存在几种可能的考虑:
- 算法完成工作最少需要多少基本操作,即最优时间复杂度
- 算法完成工作最多需要多少基本操作,即最坏时间复杂度
- 算法完成工作平均需要多少基本操作,即平均时间复杂度
假如我们有一个列表 , 我们要通过一个算法从这个列表中找到10
最坏时间复杂度:my_list = [ 1 , 5 , 6 , 4 , 3 , 2 , 7 , 8 , 9 , 10 ]
最优时间复杂度:my_list = [ 10 , 5 , 6 , 4 , 3 , 2 , 7 , 8 , 9 , 1 ]
对于最优时间复杂度,其价值不大,因为它没有提供什么有用信息其反映的只是最乐观最理想的情况,没有参考价值。
对于最坏时间复杂度,提供了一种保证,表明算法在此种程度的基本操作中一定能完成工作
对于平均时间复杂度,是对算法的一个全面评价,因此它完整全面的反映了这个算法的性质。但另一方面,这种衡量并没有保证,不是每个计算都能在这个基本操作内完成。而且,对于平均情况的计算,也会因为应用算法的实例分布可能并不均匀而难以计算。
因此,我们主要关注算法的最坏情况,亦即最坏时间复杂度
1.4 常见的时间复杂度
执行次数函数举例 | 阶 | 非正式术语 |
---|---|---|
12 | O(1) | 常数阶 |
2n+3 | O(n) | 线性阶 |
3n2+2n+1 | O(n2) | 平方阶 |
5log2n+20 | O(logn) | 对数阶 |
2n+3nlog2n+19 | O(nlogn) | nlogn阶 |
6n3+2n2+3n+4 | O(n3) | 立方阶 |
2n | O(2n) | 指数阶 |
注意,经常将log2n(以2为底的对数)简写成logn
所消耗的时间从小到大:
O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 2 l o g n ) < O ( n 3 ) O(1) < O(logn) < O(\sqrt{n})< O(n) < O(nlogn) < O(n^2) < O(n^2logn) < O(n^3) O(1)<O(logn)<O(n )<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3) < O ( 2 n ) < O ( n ! ) < O ( n n ) < O(2^n) < O(n!) < O(n^n) <O(2n)<O(n!)<O(nn)
- O ( n p ) O(n^p) O(np):多项式复杂度,该类算法可计算,该类问题可解决;
- O ( p n ) O(p^n) O(pn):指数级复杂度,该类算法不可计算,不可解决;NP-Hard复杂度问题【O(2n) 、 O(n!) 、 O(nn)】
2. 空间复杂度
空间复杂度S(n):该算法所耗费的存储空间
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量
算法的时间复杂度和空间复杂度合称为算法的复杂度
四、函数的时间复杂度(举例)
1. Python内置list类型(不能算作基本数据类型)操作的时间复杂度
方法 | 复杂度 | 简介 |
---|---|---|
index[x] | O(1) | 索引 |
index assignment | O(1) | 索引赋值 |
append | O(1) | 尾部追加 |
pop() | O(1) | 尾部弹出 |
pop(i) | O(n) | 指定位置弹出 n列表长度, 最坏时间复杂度 |
insert(i, item) | O(n) | 指定位置添加 |
del operator | O(n) | 删除, 代表一个一个元素去清空 |
iteration | O(n) | 迭代 |
contains(in) | O(n) | 看谁是否在列表中, 需要遍历 |
get slice[x:y] | O(k) | 取切片, 从x取到y, 一次定位到x, 然后取到y ,x和y之间有多少就是k |
del slice | O(n) | 删除切片 删除位置之后, 后面的元素都需要往前移动 |
set slice | O(k) | 设置切片, li[0:3] = [1, 2, 3, 4]k是补充的东西数量 |
reverse | O(n) | 置返 |
concatenate | O(k) | 代表使用的+, 把两个列表加到一起, k是第二个列表中的元素 |
sort | O(nlogn) | 排序 |
multiply | O(nk) | 相乘 li=[1, 2] -> n li * 10 -> k |
2. Python内置dict类型(不能算作基本数据类型)操作的时间复杂度
方法 | 复杂度 | 简介 |
---|---|---|
copy | O(n) | 复制 |
get item | O(1) | 取 |
set item | O(1) | 设置 |
delete item | O(1) | 删除键 |
contains(in) | O(1) | 包含 |
iteration | O(n) | 迭代 |
Dict的特性:
- 查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。
不过dict的查找速度快不是没有代价的,dict的缺点是占用内存大,还会浪费很多内容,list正好相反,占用内存小,但是查找速度慢。 - 字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。不允许同一个键出现两次。
键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行。 - dict的第二个特点就是存储的key-value序对是没有顺序的!这和list不一样。
参考资料:
常用数据结构操作与算法复杂度总结
算法复杂度分析
Master Theorem:Practice Problems and Solutions
(数据结构)十分钟搞定时间复杂度(算法的时间复杂度)
算法:算法概述【时间复杂度、空间复杂度】相关推荐
- 算法-时间频度 时间复杂度 空间复杂度
Temporal Frequency& Time Complexity& Space Complexity 计算算法执行时间 时间复杂度(Time Complexity) 常数阶O(1 ...
- PHP复杂度,php 算法复杂度 时间复杂度 空间复杂度
算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...
- 算法时间复杂度lg是多少_算法时间复杂度空间复杂度(附github)
(*useful)标记:目前觉得有用的函数 //FIXME 标记:待补充 基本初等函数: 幂函数: 一般地,形如y=xα(α为有理数)的函数,即以底数为自变量,幂为因变量,指数为常数的函数称为幂函数. ...
- a*算法的时间复杂度_算法的时间和空间复杂度,就是这么简单
算法(Algorithm) 算法是程序用来操作数据.解决程序问题的一组方法.对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别. 那么我们应该如何去 ...
- 一层循环时间复杂度_算法的时间与空间复杂度(一看就懂)
算法(Algorithm)是指用来操作数据.解决程序问题的一组方法.对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别. 那么我们应该如何去衡量不同 ...
- 排序算法-算法时间复杂度和空间复杂度概念 详细讲解
排序算法-算法时间复杂度和空间复杂度概念 详细讲解 排序算法的介绍 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类: 1)内部排序: 指将 ...
- 数据结构与算法理论概述
数据结构与算法理论概述 文章目录 数据结构与算法理论概述 数据结构概述 ◆ 数据结构涵盖的内容 ◆ 存储数据 算法概述 ◆ 算法的基本特性 ◆ 算法设计要求 ◆ 算法分析 数据结构概述 狭义上:数据结 ...
- 算法的时间与空间复杂度详解
算法(Algorithm)是指用来操作数据.解决程序问题的一组方法.对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别. 那么我们应该如何去衡量不同 ...
- LDPC译码算法代码概述
程序说明 V0.0 2015/1/24 LDPC译码算法代码概述 概述 本文介绍了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum.m, ...
- 数据结构和算法基础概述
数据结构 我是一个"栈" 计算机世界中存储和组织数据的 下面来介绍四种不同的数据存储方式 数组 存储方式:按顺序存储在连续的内存中 获取方式:只需要提供位置索引 注意事项:只能保存 ...
最新文章
- 【Hibernate】HibernateCallback总结
- codefirst 兼容oracle,EF6+MVC5之Oracleo数据库的CodeFirst方式实现
- 搭建Vue.js环境,建立一个简单的Vue项目
- java跨平台的特性_【简答题】什么是跨平台特性?Java怎样实现跨平台特性?
- bootstrap源码之滚动监听组件scrollspy.js详解
- 语音识别学习日志 2019-7-17 语音识别基础知识准备6 {维特比算法(Viterbi Algorithm)}
- Oracle存储使用情况,我收藏的oracle中一些分析空间使用情况的存储过程!
- 图像处理-RBG图像和灰度图像
- 给你一份详细的web前端CSS布局指南,请查收
- python3.6和2.7的区别_Python2.7与3.6的一些区别
- linux学习笔记十一(LVM基础)
- .vue文件 转换成html,在vue中把含有html标签转为html渲染页面的实例
- python 以行为单位进行字符串的切割
- 基于ASP.NETAJAX的WebPart开发与部署-转
- oracle rac 学习(转载)
- bp神经网络优化算法对比,提高bp神经网络精度
- html点击下载图片
- web技术基础---网站设计说明书
- 用Python制作一个自动抢票脚本
- 海尔消费金融暂停“首付贷”
热门文章
- 第八章 向量代数与空间解析几何
- 【计算机网络】计算机网络学习笔记
- 工具变量法(instrumental variable method)
- 【算法】推步聚顶 计算多边形的面积
- Warning 1: One or several characters couldn‘t be converted correctly from UTF-8 to ISO-8859-1. This
- Data Visualization(数据可视化)
- 参考文献格式——收藏之
- PMP错题整理6.6
- Unity插件 FogOfWord教程 1分钟快速生成战争迷雾(2D/3D)
- 利用LBP算子结合SVM提取建筑物(一)