时间复杂度和空间复杂度 [数据结构 初阶]
目录
算法效率
1. 时间复杂度
1.1 时间复杂度概念
1.2 大O 的渐进表示法
1.2.1 计算 func1 的基本操作执行了多少次
1.3 推导 大O 阶方法
2. 空间复杂度
算法效率
// 算法效率分析分为两种: 1) 时间效率: 时间复杂度, 用来衡量一个算法的运行速度; 2) 空间效率: 空间复杂度, 用来衡量一个算法所需要的额外空间
1. 时间复杂度
1.1 时间复杂度概念
// 时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。
// 算法的基本操作的执行次数, 就是算法的时间复杂度
1.2 大O 的渐进表示法
// 大O 符号 (Big O notation): 是用来描述函数渐进行为的数学符号
void func1(int N) {int count = 0;for(int i = 0; i < N; i++) {for( int j = 0; j < N; j++) {count++;}}for(int k = 0; k < 2 * N; k++) {count++;}int M = 10;while((M--) > 0) {count++;}System.out.println(count);
}
1.2.1 计算 func1 的基本操作执行了多少次
// 公式:
// 实际上我们计算时间复杂度时, 通常都是只算大概执行次数, 所以我们用到 大O 的渐进表示法
1.3 推导 大O 阶方法
// 使用的基本流程: 1) 常数 1 代替运行时间中所有加法常数; 2)在修改后的运行次数函数中, 只保留最高阶项; 3) 如果最高接项存在且不是 1, 则去除与这个项目相乘的常数, 得到的结果就是大O阶
// 使用 大O 的渐进表示法之后, fun1 的时间复杂度为:
// 这个需要大家多找几个例子去多练一下就 "悟了"
// 通过上面我们会发现大O 的渐进表示法去掉了哪些对结果影响不太大的项, 简洁明了的表示了执行次数
// 时间复杂度存在最好, 最坏和平均的情况:
// 最好情况: 任意输入规模的最小运行次数 (下界)
// 最坏情况: 任意输入规模的最大运行次数 (上界)
// 平均情况: 任意输入规模的期望运行次数
// 实际中, 我们一般关注的都是最坏运行情况, 所以数组中搜索数据时间复杂度为 O(N)
2. 空间复杂度
// 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度
// 空间复杂度算的是变量的个数
// 空间复杂度计算规则和时间复杂度相似, 也使用 大O 渐进表示法