01-复杂度(complexity)
什么是算法?
算法是用于解决特定问题的一系列的执行步骤。
如何判断一个算法的好坏?
正确性、可读性、健壮性(对不合理输入的反应能力和处理能力)
时间复杂度(time complexity):估算程序指令的执行次数(执行时间)
空间复杂度(space complexity):估算所需占用的存储空间
大 O 表示法(Big O)
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
O(1)
public void o1(int n) {
// 时间复杂度
// 执行次数 = 1 + 6 + 6 + 6 = 1 + 18 = 19
// 大 O 表示法:O(1)
for (int i = 0; i < 6; i++) {
System.out.println("i = " + i);
}
// 空间复杂度:O(1)
}
O(logn)
public void log2n(int n) {
// 8 = 2^3 3 = log2(8)
// 16 = 2^4 4 = log2(16)
// 执行次数 = log2(n)
// 大 O 表示法:O(logn)
while ((n = n / 2) > 0) {
System.out.println("n = " + n);
}
}
O(n)
public void n(int n) {
// 执行次数 = 1 + n + n + n = 1 + 3n = 3n + 1
// 大 O 表示法:O(n)
for (int i = 0; i < n; i++) {
System.out.println("i = " + i);
}
// 空间复杂度:O(1)
}
O(n + k)
多个数据规模的情况
// O(n + k)
public void nk(int n, int k) {
for (int i = 0; i < n; i++) {
System.out.println("i = " + i);
}
for (int i = 0; i < k; i++) {
System.out.println("i = " + i);
}
}
O(nlogn)
public void nlog2n(int n) {
// 外层 for 循环执行次数 = 1 + 2log2(n) + log2(n) * (内层 for 循环执行次数)
// = 1 + 2log2(n) + log2(n) * (3n + 1) = 3nlog2(n) + 3log2(n) + 1
// 大 O 表示法:O(nlogn)
// i += i 等价于 i = i + i 等价于 i = i * 2
for (int i = 1; i < n; i += i) {
// 内层 for 循环执行次数 = 1 + n + n + n = 3n + 1
for (int j = 0; j < n; j++) {
System.out.println("j = " + j);
}
}
// 空间复杂度:O(1)
}
O(n^2)
public void n2(int n) {
// 外层 for 循环执行次数 = 1 + n + n + n * (内层 for 循环的执行次数)
// = 1 + 2n + n * (3n + 1) = 3n^2 + 3n + 1
// 大 O 表示法:O(n^2)
for (int i = 0; i < n; i++) {
// 内层 for 循环执行次数 = 1 + n + n + n = 3n + 1
for (int j = 0; j < n; j++) {
System.out.println("j = " + j);
}
}
// 空间复杂度:O(1)
}
数据规模较小时
.
数据规模较大时
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!