《代码随想录(Carl)》 数据结构与算法 程序的性能分析知识点总结

文章详细阐述了程序性能分析的关键概念,包括时间复杂度的定义,如何描述时间复杂度,以及递归算法在时间复杂度上的分析。此外,提到了硬件配置如CPU频率对程序运行速度的影响,内存对齐的原因和优化,以及空间复杂度作为衡量算法内存占用的指标。最后,讨论了递归算法在空间复杂度上的特点。
摘要由CSDN通过智能技术生成

《代码随想录(Carl)》 数据结构与算法

程序的性能分析

2.1时间复杂度分析

2.1.1时间复杂度
时间复杂度是一个函数,它定性描述该算法的运行时间。
假设算法的数据规模为n,操作单元数量用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这个增长趋势称为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))。
算法导论给出的解释:大O用来表示上界的,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。
面试中说道算法的时间复杂度是多少指的都是一般情况。
数据用例的不一样,时间复杂度也是不同的,这一点是一定要注意的。
2.1.2如何描述时间复杂度
因为大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量。
2.1.3递归算法的时间复杂度分析
递归算法的时间复杂度 = 递归的次数 * 每次递归中的操作次数。

2.2程序的运行时间

2.2.2从硬件配置看计算机的性能
2.7 GHz 奔腾双核,i5处理器
1Hz = 1/s,1Hz 是CPU的一次脉冲(可以理解为一次改变状态,也叫时钟周期),称之为为赫兹
1GHz(兆赫)= 1000MHz(兆赫)
1MHz(兆赫)= 1百万赫兹
所以 1GHz = 10亿Hz,表示CPU可以一秒脉冲10亿次(有10亿个时钟周期),
2.7GHz为1秒27亿次脉冲, 双核理论上为54亿次脉冲。
1一般来说CPU大概运行十几次脉冲才完成一次计算;2CPU也要执行计算机的各种进程任务等,我们的程序仅仅是其中的一个进程而已。
2.2.3测试计算机的运行速度
测试计算机1s可以处理多大数量级数据的时候,有三点需要注意:
1CPU执行每条指令所需的时间实际上并不相同,例如CPU执行加法和乘法操作的耗时实际上都是不一样的。
2现在大多计算机系统的内存管理都有缓存技术,所以频繁访问相同地址的数据和访问不相邻元素所需的时间也是不同的。
3计算机同时运行多个程序,每个程序里还有不同的进程/线程在抢占资源。
尽管有很多因素影响程序的运行时间,但称职的程序员应该对程序的运行时间有一个大致的评估。
任何开发计算机程序的软件工程师都应该能够估计这个程序的运行时间是一秒钟还是一年。

2.3编程语言的内存管理

2.3.3内存对齐
不要以为只有C/C++才会有内存对齐,只要可以跨平台的编程语言都需要做内存对齐。
2.3.3.1为什么会有内存对齐?主要是两个原因:
1平台原因:不是所有的硬件平台都能访问任意内存地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。为了同一个程序可以在多平台运行,需要内存对齐。
2硬件原因:经过内存对齐后,CPU访问内存的速度大大提升。
2.3.3.2大家可能会发现内存对齐岂不是浪费的内存资源么?
相对来说计算机内存资源一般都是充足的,我们更希望的是提高运行速度。
编译器一般都会做内存对齐的优化操作,也就是说当考虑程序运行时真正占用的内存大小的时候,也需要认识到内存对齐的影响。

2.4空间复杂度分析

2.4.1空间复杂度(Space Complexity)
空间复杂度是对一个算法在运行时占用内存空间大小的量度,记做S(n)=O(f(n),依然使用大O来表示。利用程序的空间复杂度,可以预先估计程序运行时需要多少内存。
空间复杂度可以准确计算出程序运行时所占用的内存值么?
很多因素会影响程序真正使用的内存大小,例如编译器的内存对齐,编程语言容器的底层实现等这些都会影响到程序内存的开销。所以空间复杂度仅仅是预先大致评估程序内存使用的大小。
2.4.2递归算法的空间复杂度分析
递归算法的空间复杂度 = 递归的深度 * 每次递归的空间复杂度
在C/C++中递归函数传递的arr数组参数是数组首元素地址,不是整个数组拷贝一份传入函数。每一层递归都共用一块数组地址空间的,所以 每次递归的空间复杂度是常数即:O(1)。

感谢Carl对于数据结构与算法的基础知识:程序的性能分析相关知识的系统讲解工作,可查看网页 linkhttps://programmercarl.com
linkhttps://github.com/youngyangyang04/leetcode-master 中的讲解文档。
经过系统的知识学习现对整个知识体系的掌握有了一个质的飞跃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值