算法时间复杂度、空间复杂度分析

2023-05-16

算法时间复杂度

在计算机程序编写前,依据统计方法对算法进行估算,经过总结,我们发现一个高级语言编写的程序程序在计算机上运行所消耗的时间取决于下列因素:
1.算法采用的策略和方案;
⒉编译产生的代码质量;
3.问题的输入规模(所谓的问题输入规模就是输入量的多少);
4.机器执行指令的速度;

由此可见,抛开这些与计算机硬件、软件有关的因素,一个程序的运行时间依赖于算法的好坏和问题的输入规模。
如果算法固定,那么该算法的执行时间就只和问题的输入规模有关系了。

我们研究算法复杂度,侧重的是当输入规模不断增大时,算法的增长量的一个抽象(规律),而不是精确地定位需要执行多少次,因为如果是这样的话,我们又得考虑回编译期优化等问题,容易主次跌倒。

我们不关心编写程序所用的语言是什么,也不关心这些程序将跑在什么样的计算机上,我们只关心它所实现的算法。

这样,不计那些循环索引的递增和循环终止的条件、变量声明、打印结果等操作,最终在分析程序的运行时间时,最重要的是把程序看做是独立于程序设计语言的算法或一系列步骤。
我们分析一个算法的运行时间,最重要的就是把 核心操作的次数和输入规模 关联起来。

算法时间复杂度分析 T(n)=O(f(n)),大O推导法则

定义∶
在进行算法分析时,语句总的执行次数 T(n)是关于问题规模 n 的函数,进而分析T(n) 随着 n 的变化情况并确定 T(n)的量级。
算法的时间复杂度,就是算法的时间量度,记作:T(n)=O(f(n))。
它表示随着问题规模 n 的增大,算法执行时间的增长率和 f(n) 的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度,其中f(n)是问题规模 n 的某个函数。
在这里插入图片描述
在这里,我们需要明确一个事情︰执行次数=执行时间
用大写O来体现算法时间复杂度的记法,我们称之为***大O记法***。一般情况下,随着输入规模 n 的增大,T(n)增长最慢的算法为最优算法。
如果用大O记法表示下面三个个算法的时间复杂度,应该如何表示呢?
算法一:

public static void main(string[ ] args) {
	int sum = 0;	//执行1次
	int n=100;	//执行1次
	for (int i = 1; i <= n; i++) {
		sum += i;	//执行了n次
	}
	system.out.println( "sum=" + sum) ;
}

算法二:

public static void main( string[] args) {
	int sum = o;	//执行1次
	int n=100;	//执行1次
	for (int i = 1; i <= n; i++) {
		sum += i;	//执行了n次
	}
	system.out.println( "sum=" + sum);
}

算法三:

public static void main( string[] args) {
	int sum=o;	//执行1次
	int n=100;	//执行1次
	for (int i = 1; i <=n ; i++) {
		for (int j = 1; j <=n ; j++){
			sum+=i;	//执行n^2次
		}
	}
	system.out.println( "sum="+sum);
}

如果忽略判断条件的执行次数和输出语句的执行次数,那么当输入规模为n时,以上算法执行的次数分别为:
算法一∶ 3次
算法二 : n+3次
算法三 : n^2+2次

大O推导法则

基于我们对函数渐近增长的分析,推导大O阶的表示法有以下几个规则可以使用∶
1.用常数1取代运行时间中的所有加法常数;
2.在修改后的运行次数中,只保留高阶项;
3.如果最高阶项存在,且常数因子不为1,则去除与这个项相乘的常数;

所以上术算法的大〇记法分别为:
算法一∶ O(1)
算法二 : O(n)
算法三 : O(2^n)

常见大O阶:

线性阶 O(n) ,非嵌套循环

一般含有非嵌套循环涉及线性阶,线性阶就是随着输入规模的扩大,对应计算次数呈直线增长,例如∶

public static void main(string[] args) {
	int sum = 0;
	int n=100;
	for (int i = 1; i <= n; i++) {
		sum += i;
		system.out.println( "sum=" + sum);
	}
}

这段代码,它的循环的时间复杂度为O(n),因为循环体中的代码需要执行n次。

平方阶 O(n^2),循环双层嵌套

一般嵌套循环属于这种时间复杂度:

public static void main(string[ ] args) {
	int sum=0,n=100;
	for (int i = 1; i <=n ; i++) {
		for (int j = 1; j <=n ; j++){
			sum+=i;
		}
	}
	system.out.println(sum);
}

这段代码,n=100,也就是说,外层循环每执行一次,内层循环就执行100次,那总共程序想要从这两个循环中出来,就需要执行100*100次,也就是n的平方次,所以这段代码的时间复杂度是O(n^2)。

立方阶 O(n^3) ,循环三层嵌套

—般三层嵌套循环属于这种时间复杂度:

public static void main(string[ ] args) {
	int x=0,n=100;
	for (int i = 1; i <=n ; i++) {
		for (int j = i; j <=n ; j++) {
			for (int j = i; j <=n ; j++) {
				X++;
			}
		}
	}
	system.out.println(x);
}

这段代码,n=100,也就是说,外层循环每执行一次,中间循环循环就执行100次,中间循环每执行一次,最内层循环需要执行100次,那总共程序想要从这三个循环中出来,就需要执行100100100次,也就是n的立方,所以这段代码的时间复杂度是O(n^3)。

对数阶 O(logn),涉及指数幂运算

老师说对数莫慌,高中数学,分析程序以程序为主,数学为铺。

int i=1,n=100;
while(i<n){
	i=i*2}

由于每次*2之后,就距离n更近一步,假设有x个2相乘后大于n,则会退出循环。由于是2^x=n,得到 x=log(2)n,所以这个循环的时间复杂度为O(logn)。
对于对数阶,由于随着输入规模n的增大,不管底数为多少,他们的增长趋势是一样的,所以我们会忽略底数。

常数阶 O(1),不涉及循环操作,不随着输入规模的增长而增加操作次数

一般不涉及循环操作的都是常数阶,因为它不会随着输入规模n的增长而增加操作次数。例如︰

public static void main(string[ ] args) {
	int n=10o;
	int i=n+2;
	system.out.println(i);
}

上述代码,不管输入规模n是多少,都执行2次,根据大O推导法则,常数用1来替换,所以上述代码的时间复杂度为O(1)。

下表是对常见时间复杂度的一个总结:

描述增长的数量级说明举例
常数级别1普通语句将两数相加
对数级别logn二分策略二分查找
线性级别n循环找出最大元素
线性对数级别NlogN分治思想归并排序
平方级别n^2双层循环检查所有元素对
立方级别n^3三层循环检查所有三元组
指数级别2^n穷举查找检查所有子集

他们的复杂程度从低到高依次为∶
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
根据前面分析,我们会发现,从平方阶开始,随着输入规模的增大,时间成本 会急剧增大,
所以,我们的算法,尽可能的追求的是 常数阶O(1),对数阶O(logn),线性阶O(n),线性对数O(nlogn) 这几种时间复杂度而如果发现算法的时间复杂度为平方阶、立方阶或者更复杂的,那我们可以认为这种算法是不可取的,需要优化。

函数调用的时间复杂度分析

之前,我们分析的都是单个函数内,算法代码的时间复杂度,接下来我们分析函数调用过程中时间复杂度。
案列一:

public static void main(string[] args) {
	int n=100;
	for (int i = o; i < n; i++) {
	show( i);
	}
}

private static void show( int i) {
	system.out.println(i);
}

在main方法中,有一个for循环,循环体调用了show方法,由于show方法内部只执行了一行代码,所以show方法的时间复杂度为O(1),那main方法的时间复杂度就是O(n)。

案例二:

public static void main(string[] args) {
	int n=100;
	for (int i = 0; i < n; i++) {
		show(i);
	}
}

private static void show(int i) {
	for (int j = 0; j < i; i++) {
		system.out.println(i);}
}

在main方法中,有一个for循环,循环体调用了show方法,由于show方法内部也有一个for循环,所以show方法的时间复杂度为O(n)那main方法的时间复杂度为O(n^2)。

案例三:

public static void main(string[ ] args) {
	int n=100;
	show(n);   //执行次数为n^2
	for (int i = o; i < n; it) { //执行次数为n^2
		show(i);
		for (int i = o; i < n; it+) {
			for (int j = o; j < n; jt+)i
					system.out .printin(j);
		}
	}
}

private static void show( int i) {
	for (int j = 0; j < i; i++) {  //执行次数为n
		system.out.println(i);
	}
}

在show方法中,有一个for循环,所以show方法的时间复杂度为O(n)。
在main方法中,show(n)这行代码内部执行的次数为 n;
for循环内调用了show方法,所以其执行次数为 n^2;
第二个嵌套for循环内只执行了一行代码,所以其执行次数为 n^2;
那么main方法总执行次数为n+ n^2 + n^2简化为 2n^2+n 。
根据大O推导规则,去掉n保留最高阶项,并去掉最高阶项的常数因子2,
所以最终main方法的时间复杂度为O(n^2)

最坏情况,除非特别指定,我们提到的运行时间都指的是最坏情况下的运行时间

假如有一个需求,有一个存储了n个随机数字的数组,请从中查找出指定的数字。

最好情况∶查找的第一个数字就是期望的数字,那么算法的时间复杂度为O(1)
最坏情况∶查找的最后一个数字,才是期望的数字,那么算法的时间复杂度为O(n)
平均情况: 任何数字查找的平均成本是O(n/2)

最坏情况是一种保证,在应用中,这是一种最基本的保障,即使在最坏情况下,也能够正常提供服务,
所以,除非特别指定,我们提到的运行时间都指的是最坏情况下的运行时间。

算法空间复杂度

计算机的软硬件都经历了一个比较漫长的演变史,作为为运算提供环境的内存,更是如此,
从早些时候的512k,经历了1M,2M ,4M…等,发展到现在的8G,甚至16G和32G。
所以早期时候,算法在运行过程中对内存的占用情况也是一个经常需要考虑的问题。
那么 我们可以用算法的空间复杂度来描述算法对内存的占用。

常见内存占用:

1.Java为例,基本数据类型定义存储,内存占用:
在这里插入图片描述
2.计算机访问内存的方式都是一次一个字节
在这里插入图片描述
3.—个引用(机器地址)需要8个字节表示︰

//date这个变量需要占用8个字节来表示
Date date = new Date();

4.创建一个对象,比如new Date(),除了Date对象内部存储的数据(例如年月日等信息)占用的内存,
对象本身也有内存开销,每个对象的自身开销是16个字节,用来保存对象的头信息

5.—般内存的使用,如果不够8个字节,都会被自动填充为8字节:

public class A{
	public int a = 1;
}
/*通过new A()创建一个对象的内存占用如下:
1.整型成员变量a占用4个字节;
2.对象本身占用16个字节;
那么创建该对象总共需要20个字节,但由于不是以8位单位,会自动填充为24个字节
*/

算法的空间复杂度分析 S(n) = O(f(n))

了解了java语言为例的内存最基本的机制,就能够有效帮助我们估计大量程序的内存使用情况。
算法的空间复杂度计算公式记作: S(n) = O(f(n))
其中n为输入规模,f(n) 为语句关于n所占存储空间的函数。

案例:对指定的数组元素进行反转,并返回反转的内容。
解法一:
public static int[ ] reverse1(int[ ] arr){
	int n=arr.length;//申请4个字节
	int temp;//申请4个字节
	for(int start=0,end=n-1;start <= end ; start++,end--){
		temp=arr[start];
		arr[start]=arr[end];arr[end ]=temp;
	}
	return arr;
}
解法二:
public static int[ ] reverse2(int[] arr){
	int n=arr.length;//申请4个字节
	int[] temp=new int[n];//申请n*4个字节+数组自身头信息开销24个字节
	for (int i = n-1; i >=o; i--) {
		temp[n-1-i]=arr[i];
	}
	return temp;
}
对比分析:

忽略 判断条件占用的内存,我们得出的内存占用情况如下:
算法一︰
不管传入的数组大小为多少,始终额外申请4+4=8个字节;
算法二︰
4+4n+24=4n+28;
根据大O推导法则,算法一的空间复杂度为O(1),算法二的空间复杂度为O(n)。

所以从空间占用的角度讲,算法一 要 优于算法二。

由于java中有内存垃圾回收机制,并且jvm对程序的内存占用也有优化(例如即时编译),我们无法精确的评估一个java程序的内存占用情况,但是了解了java的基本内存占用,使我们可以对java程序的内存占用情况进行估算。

由于现在的计算机设备内存一般都比较大,基本上个人计算机都是4G起步,大的可以达到32G,
所以内存占用一般情况下并不是我们算法的瓶颈,普通情况下直接说复杂度,默认为算法的时间复杂度。

但是,如果你做的程序是嵌入式开发,尤其是一些传感器设备上的内置程序,由于这些设备的内存很小,一般为几kb,这个时候对算法的空间复杂度就有要求了,但是一般做java开发的,基本上都是服务器开发,一般不存在这样的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法时间复杂度、空间复杂度分析 的相关文章

  • 串口DMA发送接收

    目录 一 DMA的基本介绍 1 DMA定义 2 原理 1 请求 2 响应 3 传输 4 结束 3 传送方式 1 停止CPU访问内存 2 周期挪用 3 DMA与CPU交替访问内存 4 DMA中断 二 新建cubemx项目 1 选择STM32F
  • Time Limit Exceeded的原因

    Time Limit Exceeded的原因及避免方法 荷叶田田 CSDN博客
  • GStreamer学习三(延迟)

    1 延迟 延迟 xff08 即latency xff09 是在时间戳0处捕获的样本到达接收器所花费的时间 此时间是根据流水线的时钟测量的 对于只有包含与时钟同步的 接收器 元素的流水线 xff0c latency 始终为0 xff0c 因为
  • 第一届ACC全国高校联赛

    y 竞赛 AcWing 面向全国高校同学的高校联赛 https www acwing com activity content 1173 一 1 暴力 include lt bits stdc 43 43 h gt using namesp
  • JDBC连接数据库

    个人简介 x1f496 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki x1f4c2 喜欢 xff1a x1f308 点赞 x1f308 收藏 xff01 更新Java x1f308 python
  • idea 文件夹右键新建没有Class

    个人简介 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki 喜欢 xff1a x1f308 点赞 x1f308 收藏 x1f308 一键三连 xff01 共勉 一 问题发现 xff1a 没法创建ja
  • 《关于我找了好久的bug,却没找出来的,又不小心解决了的事》

    个人简介 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki 喜欢 xff1a x1f308 点赞 x1f308 收藏 x1f308 一键三连 xff01 共勉 问题 xff1a 这是一个Spring
  • 某某科技实习日志

    个人简介 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki 喜欢 xff1a x1f308 点赞 x1f308 收藏 x1f308 一键三连 xff01 共勉 时间 2023年 4月 11日 今日任
  • XXXX实习日志

    个人简介 作者简介 xff1a 大家好 xff01 我是yukki 个人主页 xff1a yukki 喜欢 xff1a x1f308 点赞 x1f308 收藏 x1f308 一键三连 xff01 共勉 时间 2023年 4月 12日 今日任
  • STM32——中断优先级分组

    一 SCB AIRCR寄存器 首先 xff0c 对STM32中断进行分组 xff0c 0 4 同时 xff0c 每个中断设置一个抢占优先级和一个响应优先级 1 高抢占可以打断正在执行的低抢占 2 抢占相等 xff0c 高响应不能打断低响应
  • Keil报错总结(1)

    一 newline expected extra characters found c323 头文件定义有问题 ifndef define endif 他们后面的文件名与文件名不一致 xff0c 或者大小写不一致 xff0c 文件名尽量避免
  • GPIO实验

    一 GPIO简介 GPIO xff08 General purpose input output xff09 即通用型输入输出 xff0c GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连 xff0c 从而实
  • Exynos_4412——中断处理(中断学习结尾篇)

    目录 一 ARM的异常处理机制 1 1异常概念 1 2异常处理机制 1 3ARM异常源 1 4异常模式 1 5ARM异常响应 1 6异常向量表 1 7异常返回 1 8IRQ异常举例 二 工程模板代码结构 三 中断处理框架搭建 四 中断处理程
  • ROS中控制小乌龟移动(2种方法)

    操作系统 xff1a Ubuntu16 04 ROS版本 xff1a Kinetic 目录 方法一 xff1a 用键盘控制小乌龟移动1 启动ROS Master2 打开小乌龟3 键盘控制小乌龟 方法二 xff1a 通过命令发布话题控制小乌龟
  • QT/C++——对话框

    一 标准对话框 include 34 widget h 34 include lt QVBoxLayout gt include lt QHBoxLayout gt Widget Widget QWidget parent QWidget
  • QT/C++——主窗口和事件处理

    一 主窗口 上面就是一个主窗口 xff0c 主窗口中的每一个都是Action 这次新建工程要选择mainwindow ifndef MAINWINDOW H define MAINWINDOW H include lt QMainWindo
  • QT/C++——网络编程

    目录 一 基础知识复习 二 UDP 客户端 xff1a 服务器 xff1a 三 TCP 服务器 xff1a 客户端 xff1a 四 小项目 客户端 xff1a 服务器 xff1a 一 基础知识复习 这部分内容前面讲的比较详细 xff0c 现
  • Linux驱动开发——高级I/O操作(一)

    一个设备除了能通过读写操作来收发数据或返回 保存数据 xff0c 还应该有很多其他的操作 比如一个串口设备还应该具备波特率获取和设置 帧格式获取和设置的操作 一个LED设备甚至不应该有读写操作 xff0c 而应该具备点灯和灭灯的操作 硬件设
  • ubuntu22.04安装与配置

    目录 一 环境及下载 iso下载 VM配置 二 虚拟机与环境配置 虚拟机开始后的配置 一些工具配置 参考 xff1a VMware Workstation Pro 文档 一 环境及下载 iso下载 Download Ubuntu Deskt
  • Linux——互斥与同步

    目录 一种典型的竞态 内核中的并发 中断屏蔽 原子变量 自旋锁 读写锁 顺序锁 一种典型的竞态 假设整型变量i是驱动代码中的一个个全局变量 xff0c 在驱动的某个例程中执行了i 43 43 操作 xff0c 而在中断服务程序中也执行了i

随机推荐

  • 基于max30102的物联网病房监测系统(传感驱动和数据处理)

    目录 一 实物展示 二 主体介绍 三 MAX30102的驱动 四 MAX30102的数据处理 奋斗一个星期 xff0c 每个引脚都是扒皮焊接然后再把皮包回去的 这几天吸的垃圾气体感觉要少活两年 一 实物展示 这次吸取上次教训 xff0c 把
  • 基于max30102的物联网病房监测系统(中断处理和主题逻辑)

    目录 五 中断处理 六 主体框架 对采集数据的初始化 核心功能的实现 烟雾 通信帧格式 wifi接收数据的处理 OLED显示 五 中断处理 void SysTick Handler void TimingDelay Decrement vo
  • 无人机4G数传方案(合宙cat1模块)

    一 合宙Cat1简介 YED C724 核心板是由银尔达 xff08 yinerda xff09 基于合宙 Air724 模组推出的低功耗 xff0c 超小体积 xff0c 高性能嵌入式 4G Cat1 核心版 xff0c 标准的 2 54
  • C++学习ros2话题机制(发布与订阅)

    C 43 43 学习ros2 一 创建文件和文件夹1 结构2 创建工作空间和工作包3 直接创建node cpp文件 二 编写节点文件 xff08 发布订阅 xff09 1 node1 cpp xff08 发布 xff09 2 CMakeLi
  • AttributeError: module ‘keras.backend’ has no attribute ‘set_image_dim_ordering’

    问题 原始代码如下 xff1a keras span class token punctuation span backend span class token punctuation span set image dim ordering
  • openmv识别红色物体并返回坐标给stm32单片机,通过pid控制舵机云台

    本人搜索了有关于舵机云台pid控制的代码 xff0c 但是都没有搜到想要的结果 xff0c 现在自己写出来了代码 xff0c 所以就将自己写的代码分享出来 xff0c 和大家一起学习进步 1 openmv识别红色物体 43 返回中心坐标的的
  • vs解决报错:C++ qualified name is not allowed(E0283)

    我们看 把在GCC下编译过关的c 43 43 程序放在vs下却不能过 仅给出部分代码 其他以此类推 先不要慌着改 看下详细信息 看上去都是语法错误 但这真的没任何语法错误啊 百度上查找下 报错信息都不一样 别人是类里面多加限定符 我这是正常
  • Linux下的man命令

    目录 一 man是什么 xff1f 二 man命令的使用1 通过man man查看man手册2 通过man来进行查询 四 总结 一 man是什么 xff1f man所代表的的是英文单词manual xff0c 也就是帮助手册的意思 xff0
  • IO多路复用之select

    目录 一 IO多路复用二 select函数三 select实现socket服务器 xff08 1 xff09 流程图 xff1a xff08 2 xff09 代码讲解 xff1a 四 总结代码示例 xff1a 一 IO多路复用 IO多路复用
  • curl 和 wget 命令下载

    curl 和 wget 命令下载 一 wget下载1 wget介绍2 wget下载方法 二 curl下载1 curl介绍2 curl下载方法 三 wget下载sqlite实例总结 一 wget下载 1 wget介绍 wget 是一个从网络上
  • Linux下载安装和使用SQLite

    Linux安装SQLite 一 SQLite下载二 SQLite安装三 SQLite的使用1 解决无法直接用sqlit3命令2 解决无法编译的问题 总结 一 SQLite下载 首先 xff0c 前往SQLite官网下载页面找到包含confi
  • 解决:‘config.status: error: Something went wrong bootstrapping makefile fragments......’问题

    解决 xff1a config status error Something went wrong bootstrapping makefile fragments 问题 一 问题二 解决方法 一 问题 首先我们来看安装sqlite时报的这
  • TFTP服务器搭建与使用

    文章目录 一 TFTP协议二 TFTP服务器搭建1 安装TFTP服务器2 创建TFTP服务文件夹3 配置tftp文件4 配置tftpd hpa文件 三 TFTP服务器使用 一 TFTP协议 TFTP xff08 Trivial File T
  • 深入探讨Linux驱动开发:Linux设备树

    文章目录 一 设备树介绍二 设备树框架1 设备树框架2 节点基本格式3 节点部分属性简介 总结 一 设备树介绍 设备树 xff08 Device Tree xff0c 简称 DT xff09 是一种在嵌入式系统中描述硬件设备的一种数据结构和
  • 深入探讨Linux驱动开发:驱动介绍与hello驱动实例

    文章目录 前言一 Linux驱动介绍1 用户态和内核态2 内核功能介绍3 驱动程序介绍 二 驱动程序分类与注意事项1 驱动程序分类2 内核驱动开发注意事项 三 hello驱动开发1 驱动模块2 模块加载和卸载函数3 编写hello模块4 M
  • ROS中使用乐视 奥比中光(Astra Pro)深度相机显示彩色和深度图像

    环境 UbuntuROS Kinect or Melodic 奥比中光ROS驱动包安装地址 xff1a https github com orbbec ros astra camera 1 安装ROS 2 安装依赖 span class t
  • 深入探讨Linux驱动开发:字符设备驱动开发与测试

    文章目录 一 字符设备驱动介绍1 设备驱动介绍 二 设备号1 设备号介绍2 分配与释放设备编号 dev t类型 静态分配设备号 动态分配设备号 释放主次设备号 手动创建设备节点 自动创建设备节点 删除设备节点 三 字符设备注册1 cdev结
  • ZED-深度感知使用

    文章目录 1 深度感知配置2 得到深度数据2 1 得到深度值 3 展示深度图4 获取点云数据4 1 从点云数据中计算距离 5 得到法线图像6 调整深度分辨率 1 深度感知配置 可以在初始化时使用InitParameters xff0c 在运
  • Linux系统之 开机自启动程序脚本 编写

    Linux系统启动加载程序 最近完成了项目 xff0c 来个开机自启运行 找到已编译好的程序 xff08 以下是我编译的house xff09 span class token function ls span l span class t
  • 算法时间复杂度、空间复杂度分析

    算法时间复杂度 在计算机程序编写前 xff0c 依据统计方法对算法进行估算 xff0c 经过总结 xff0c 我们发现一个高级语言编写的程序程序在计算机上运行所消耗的时间取决于下列因素 1 算法采用的策略和方案 编译产生的代码质量 3 问题