时间复杂度T(n)和渐进时间复杂度O(n)是什么,该如何计算?
提示:本文属于基础篇,内容过多,如果对此已有了解,可以直接阅读加粗文字
算法的效率 = 运行的时间 + 所需的存储空间 ,我们暂时不考虑存储空间,如何度量运行时间是本文讨论的内容,我们首先要考虑到影响算法执行时间的主要因素:算法选用的策略 、问题的规模。一个特定算法的运行时间,它是问题规模(通常用整数n表示)的函数。
总结:一个算法的语句执行的次数称为语句频度或者时间频度,表示为T(n),n表示问题的规模;O(n)也是一个函数,它表示渐进时间复杂度,又叫大O表示法。
算法的量度记为:T(n)=O(f(n)) ——渐进时间复杂度
T(n)=O(f(n))的数学含义:存在两个常量C和N,当n≥N时,有T(n)≤C*f(n)
那么根据这个式子(过程不再描述)可以得出:
- 与T(n)相比,f(n)更为简洁,但依然会反映前者的增长趋势
- 低次项可忽略
总结:一般地,若T(n)是有关n的一个多项式,则f(n)可由T(n)中的最高此项去掉系数所得。
例:设有函数T(n)=3n²-n+4,请证明T(n)=O(n²)。
证明:因为存在C=6,N=1,对所有的n≥N,0≤3n²-n+4≤6n²都是成立的,所以由大O的定义可得T(n)=O(n²)。**
T(n)=O(f(n)),这是大O表示的渐进时间复杂度,它表示随着问题规模n的增长,算法执行时间的增长率是相同的,而且f(n)比T(n)更为简洁,f(n)由T(n)“去粗取精”(低次项忽略,常系数忽略)得到。
那么如何估算一个指定算法的时间复杂度呢?
算法 = 控制结构 + 原操作(对固有类型数据的操作)
算法的执行时间T(n) = 原操作重复执行的次数 或 原操作的语句频度
下面我们使用上面的结论估算一个算法的时间复杂度:
void mult(int a[],int b[],int &c[],int n){//以二维数组村粗矩阵元素,c为a和b的乘积 //语句频度for(i=1;i<=n;i++) //n+1for(j=1;j<=n;j++){ //n(n+1)c[i,j]=0; //n² 关键操作for(k=1;k<=n;k++) //n²*(n+1)c[i,j] += a[i,k] * b[k,j]; //n³ 关键操作}
}//所以T(n)=n³+n²=O(n³)
结论:T(n) = 关键操作的语句频度 ,而关键操作往往就是算法中控制结构内最深层的原操作。
虽然我们用关键操作的频度来度量一个算法的操作时间,它所计算出来的量并不是时间量,而是一种增长趋势的量度,但是它与软硬件无关,只反映算法本身执行效率的优劣,所以是简便且有效的。下面我们一起来看例题:
//例题1,求下列程序段的时间复杂度
for(int i=1;i<=n;i=2*i)printf("i=%d\n",i); //关键操作
解题:设关键操作语句的执行次数为T(n)
有 2T(n)≤n,所以T(n)≤log2n,所以关键操作的语句频度是log2n向下取整
T(n)=O(log2n)=O(logn)
//例题2,求下列程序段的时间复杂度
for(int i=1;i<=n;i=2*i)for(int j=0;j<i;j++)printf("i=%4d",i); //关键操作
解题:设关键操作语句的执行次数为T(n),那么有
T(n)=20+21+22+…+2^log2n
这是一个几何级数,几何增速与末项的级数是相同的,所以这个算法的复杂度是T(n)=O(2^log2n)=O(n)
归纳:
多项式时间算法的时间复杂度:
O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)
指数时间算法的时间复杂度:
O(2n)<O(n!)<O(nn)
注意:线性集和对数集的增长趋势是比较平稳的,但是线性复杂度的算法不一定快于平方时间复杂度或者其他复杂度的算法,当问题规模n足够大才是恒成立的,所以时间复杂度比较时得看问题规模n的大小。
时间复杂度T(n)和渐进时间复杂度O(n)是什么,该如何计算?相关推荐
- 时间复杂度(算法的渐进时间复杂度)
0.时间复杂度:算法执行的次数(或者程序运行所需要的时间) 1.时间=执行次数 2.定义:程序T(n)随着问题规模n的增加,确定f(n)的数量级,记做 T(n)=O(f(n)),增长率(看程序潜在能力 ...
- 一层循环时间复杂度_渐进时间复杂度分析
公众号:原与译 直接看题: 给定一个自然数 n,然后求出前 n 个自然数的和 sum.( n > 0 ) 如: n = 3,则 sum = 1 + 2 + 3 = 6 n = 5,则 sum = ...
- 数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界
目录 2.1.概述 2.2.时间复杂度的计算 2.2.1.渐进复杂度 2.2.2.渐进上界 2.2.3.渐进下届 2.2.4.复杂度排序 2.2.5.举几个例子 2.1.概述 算法的基本定义: 求解问 ...
- 【数据结构】算法的渐进分析-渐进时间复杂度
算法的渐进分析(asymptotic algorithm analysis)简称算法分析.算法分析直接与它所求解的问题的规模 n 有关,因此,通常将问题规模作为分析的参数,求算法的时间和空间开销与问 ...
- python冒泡排序时间复杂度_Python算法中的时间复杂度问题
在实现算法的时候,通常会从两方面考虑算法的复杂度,即时间复杂度和空间复杂度.顾名思义,时间复杂度用于度量算法的计算工作量,空间复杂度用于度量算法占用的内存空间. 本文将从时间复杂度的概念出发,结合实际 ...
- 时间复杂度解析 根据算法换算时间复杂度 常见时间复杂度及其之间的关系
一.引入 先看一道题,如果 a+b+c=1000,且 a2+b2=c^2(a,b,c 为自然数),如何求出所有a.b.c可能的组合? 二.两种解答方式 算法是独立存在的一种解决问题的方法和思想. 第一 ...
- 算法时间复杂度lg是多少_时间复杂度入门理解
前言 当你编写完一个程序的时候,怎样对它进行算法最优的判断呢?效率又是怎样体现的呢?效率=总执行次数/总时间,一般来说,程序越庞大,其执行效率越低.因此,对于模块化程序,优化其算法的时间复杂度是非常重 ...
- pythonsort函数时间复杂度_合并排序算法——时间复杂度详解和python代码实现
递归形式 递归形式是算法中常用到的一种构造思路.递归允许函数或过程对自身进行调用,是对算法中重复过程的高度概括,从本质层面进行刻画,避免算法书写中过多的嵌套循环和分支语法.因此,是对算法结构很大的简化 ...
- 计蒜客 时间复杂度 (模拟) 洛谷 P3952 时间复杂度
链接 : Here! 思路 : 这是一道大模拟, 区分好情况就没问题了 循环构成部分 : $F , x , i , j$ 和 $E$ , 需要注意的是 $i , j$, - 分析 $i, j$ 的情况 ...
最新文章
- [转] 微软SQL Server 2008故障转移集群概述(Windows Server Failover Clustering (WSFC))
- html中怎么设置文本框居中显示图片,css如何让图片水平居中显示?
- java wrapper linux_Java Service Wrapper linux 服务 java 自启动
- VR来了,科技的各行各业要如何做好准备?
- s-palindrome
- 《OpenGL超级宝典》第二章:入门指南
- VMware中ip地址消失问题
- 局域网内时间同步配置
- Python错误集锦:除法运算时提示ZeroDivisionError: division by zero
- 宠物商店mysql数据库设计_宠物商城数据库设计
- iOS wkWebview调整html文字大小以及文字两端对齐
- C语言(谭浩强版本,主讲人:小甲鱼)P1-P9
- m4a转如何快速转换为wav格式呢
- 调用企业微信API,ios端异常
- 邻居好说话:冒泡排序
- 天猫精灵 python 控制_天猫精灵的高阶玩法-控制我的电脑
- Opencv4学习-2、小案例之绿布抠图-视频背景图替换
- 读取Excel表格内容转为Sql when then语句
- 【学生必备求职指南】好简历是怎样炼成的?毕业生简历实例点评版
- node实现cmd弹窗交互——inquirer
热门文章
- oracle同一张表卡住很多次,极度诡异的oracle同一张表操作两次的问题
- Django_simpleui 笔记
- 串口流控 UART 中 CTS RTS RX TX (串口模组和MCU直接的通信)
- 吴通光电电能管理系统的设计与应用
- ACREL-3000电能管理系统在金桥德勤电能管理系统项目中的应用-安科瑞苏月婷
- eda技术试卷_EDA技术试题库完整
- 《SQL必知必会》查询部分学习笔记
- RabbitMQ概念及环境搭建(二)RabbitMQ Broker管理
- uploadify插件浏览器flash兼容
- 中国管道处理系统市场发展现状与投资策略分析报告2022-2028年