时间复杂度、渐进记法、主定理
目录
一 、 大 O 记法
二、Ω 记法。
三、 Θ记法
四、小o记法
五、命中缓存对时间效率的影响。
六、主定理
时间复杂度反应了一个程序的运行时间关于实例个数变化而变化规律。在一个排序程序中,可能比较了 2n 次,但是执行步数可能达到了 2n^3 ,就不能直接判定程序运行时间是 n 的线性函数。两个程序比较次数一个是3n,一个是2n 那么不能说前者的花费的时间就要更慢些,因为在总的执行步数上未必会比后者多。
当实例个数足够多的时候,计量时间的方法叫做渐进记法,最常用的是 O(g(x)) 表示。其他常用还有 o , Ω , Θ 记法。
一 、 大 O 记法
当实例个数n足够多时 ,程序执行总步数 f(n) = O(g(n)) 时满足 :
例如 当 程序执行步数为 f(n)= n^2+ 4log2 n 那么 f(n) = O(n^2) 成立, f(n) = O(n^3) 也成立。
二、Ω 记法。
当实例个数n足够多时 ,程序执行总步数 f(n) = Ω(g(n)) 时满足 :
其中C为常数。
例如 当 程序执行步数为 f(n)= n^2+ 4log2 n 那么 f(n) = Ω(n^2) 成立, f(n) = Ω(n) 也成立。 f(n) = Ω(n^3) 不成立
三、 Θ记法
当实例个数n足够多时 ,程序执行总步数 f(n) = Θ(g(n)) 时满足 :
其中C为常数。
例如 当 程序执行步数为 f(n)= n^2+ 4log2 n 那么 f(n) = Θ(n^2) 成立, f(n) = Θ(n) 不成立。 f(n) = Θ(n^3) 不成立
四、小o记法
当实例个数n足够多时 ,程序执行总步数 f(n) = o(g(n)) 时满足 :
当且仅当 f(n) =O(g(n)) 且 f(n) 不等于 Ω (g(n)) 时 即
例如 当 程序执行步数为 f(n)= n^2+ 4log2 n 那么 f(n) = o(n^2) 不成立, f(n) = o(n) 成立。 f(n) = o(n^3) 不成立
五、命中缓存对时间效率的影响。
在简单的计算机模型中,它的存储由1级缓存,二级缓存和主存构成。算术和逻辑操作由算术和逻辑单元 (ALU) 对存储在寄存器R中的数据进行处理来完成。通常主存的大小时几百MB,二级缓存大小不足1MB,1级缓存的大小是几十KB,寄存器的数量在8到32之间。容量越小的,读取效率越高。
程序在运行时,所有数据都在主存,当要读取数据时,程序会率先在1级缓存中去找,如果没有再去二级缓存去找,之后再去主存中去找,在缓存中读取的需要数据比起在主存中读取需要的数据效率来得高。如果在主存中找到需要的数据,会把它复制到在二级缓存,一级缓存和寄存器中,再进行操作。
因为缓存的存在,时程序相同执行步数的情况下,耗时也可能会大有不同。
例如有二维数组即矩阵的乘法运算
//程序1 i j k 的遍历方式
void multiplyMartix(int **a , int ** b ,int **c,int n){//初始化矩阵c 的值为 0 initial(c,0);for (int i =0 ; i< n ;i++)for (int j =0 ; j< n ;k++)for (int k =0 ; k< n ;k++)c[i][j] += a[i][k] * b[k][j];
}//效率的更高的程序二 i k j 的遍历方式
void multiplyMartix(int **a , int ** b ,int **c,int n){//初始化矩阵c 的值为 0 initial(c,0);for (int i =0 ; i< n ;i++)for (int k =0 ; k< n ;k++)for (int j =0 ; j< n ;k++)c[i][j] += a[i][k] * b[k][j];
}
由与第二个程序,再1次内部第3层循环中,每一次循环读的 a[i][k] 的临时变量都是同一个,所以缓存命中次数要比第1个程序占比来得高,效率更快。
六、主定理
时间复杂度、渐进记法、主定理相关推荐
- 主定理(Master Theorem)与时间复杂度
1. 问题 Karatsuba 大整数的快速乘积算法的运行时间(时间复杂度的递推关系式)为 T(n)=O(n)+4⋅T(n/2),求其最终的时间复杂度. 2. 主定理的内容 3. 分析 所以根据主定理 ...
- 时间复杂度主定理分析及练习
本文主要分析主定理,时间复杂度详细分析请移步至此.主定理是一种现在常用分析时间复杂度的方法,它主要适用于递归形式如下: 当 和 为常量且是一个渐进正函数时有以下三种情况: 如果,则 如果,则 如果 ...
- 基于主定理以及递推树求解递归算法的时间复杂度
非递归算法的时间复杂度可以通过找到执行次数最多的代码,计算其执行次数即可.但是递归算法的时间复杂度则无法通过这种方式求得.有一种最简单的求递归算法的方式,即利用递推方法求解时间复杂度.如下所示: 这种 ...
- 使用主定理求时间复杂度
文章目录 使用主定理求时间复杂度 主定理 直接可用主定理 转化之后可以利用主定理 使用主定理求时间复杂度 很多算法最后都可以写出 T(n)=aT(nb)+f(n))(a≥1,b≥1)T(n)=aT(\ ...
- 运用主定理计算递归问题时间复杂度
主定理 符号Θ ,既是上界也是下界,等于. 符号O ,表示上界,时间复杂度小于等于该值. 符号Ω ,表示下界,时间复杂度大于等于该值. 意思就是Θ 是平均时间复杂度,O 是最坏情况下的复杂度,Ω 是最 ...
- 时间复杂度-主定理分析
目录 1.定理 2.举例 1.定理 主定理分析是一种时间复杂度的计算方式,当时间复杂度推根据实际情况推算出来是下面T(n)的形式的时候,可以通过主定理分析计算它的时间复杂度. 其实就是根据前半部分的a ...
- 递归算法时间复杂度的数学证明过程(主定理)
由于平常的工作有时候会碰到递归,又刚好看到了这个主定理,因此多了解了一点,了解这个定理大致是怎么推导的.本文内容主要参照B站视频https://www.bilibili.com/video/BV1Q7 ...
- 主定理求解算法时间复杂度
主定理 所谓主定理,就是用来解递归方程的一种方法,此方法可以用来求解大多数递归方程. 设递归方程为T(n)=aT(n/b)+f(n) (其中a≥1,b>1) 主定理: 1. 如果存在常数ε&g ...
- 【算法导论-主定理】用主方法求解递归式 学练结合版
问题:若某算法的计算时间表示为递推关系式:T(N)=2T(N/2)+NlogN 且 T(1)=1 则该算法的时间复杂度为( ). O(Nsqrt(N)) O(NlogN) O(N(logN)^2) O ...
最新文章
- 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的...
- Java 循环控制语句break/return/continue的使用
- 【跟着我们学Golang】Go语言全平台安装
- mvc4 html.pager,MVC分页之MvcPager使用详解
- 前端学习(1702):前端系列javascript之this
- 【语义分割】论文代码资料汇总
- Java编程思想 (1~10)
- SpringMvc-ResponseBodyAdvice接口与@ControllerAdvice注解
- 关于 Appium 各种版本的安装,都在这里
- 如何解决PHP startup: Unable to load dynamic library的错误
- LeetCode解题思路—双指针模式
- 关于wait、notify在火车售票战的实例
- Hi3516E V200功能介绍
- DH算法(密钥交换算法)
- 您仅仅是一个可雕刻的榆木疙瘩。。。
- 简述力法计算弹性固定无铰拱的原理_隧道结构力学计算5页
- html渐变色原理,CSS渐变色效果的实现方法与效果演示
- 辉光管时钟系列<三>时钟芯片DS12C887
- 【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 将微服务运行在Docker上
- 今天给大家分享用scratch制作最难通关管道小游戏!
热门文章
- 优先队列(个人模版)
- jquery easyui dataGrid动态改变排序字段名
- ORA-04031错误导致宕机案例分析
- linux7.5进单用户模式,linux进入单用户模式
- 【亲测有效】andriod studio性能优化
- vscode中reactjs插件的安装
- Linux find命令批量替换字符串find roles/hadoop_ha/vars/ -name “*.yml“ |xargs perl -pi -e ‘s|node135|node108|g‘
- storm后台启动命令(避免新开窗口)
- 巨鲸任务调度平台:spark flink任务调度
- deepin linux深度ISO镜像下载地址