zq—算法基础:时空复杂度(1)

算法基础之时空复杂度(1)

算法复杂度的定义

复杂度分析

算法复杂度是衡量算法的重要工具,用于描述算法的资源消耗与输入规模的关系

时间复杂度vs空间复杂度

“时间”vs“存储空间”
预测算法性能,比较不同算法vs评估内存使用,优化存储效率

重要性

复杂度分析帮助我们选择合适的算法,特别是在处理大规模数据时


渐进分析

关注点:

当数据规模n趋于无穷大时的增长趋势

三种情况:

  1. 最好情况
  2. 平均情况
  3. 最坏情况

- 通常分析最坏情况:保证性能下界


数学符号

三种表示法

微信图片_20260317231728_450_800

大 O 的性质

重要性质

  • 忽略常数系数:O(3n)=O(n)
  • 忽略低阶项:\(O(n^2+n)=O(n^2)\)
  • 传递性:如果f(n)=O(g(n))且g(n)=O(h(n)),f(n)=O(h(n))

eg.\(T(n)=5n^2+3n+10\)
               \(=O(n^2+n+1)\)
               \(=O(n^2)\)


算法复杂度层次图微信图片_20260317233727_451_800


算法竞赛中的复杂度要求

重要原则

  • 算法竞赛中,一般每题的复杂度上限为\(2\times10^7\)次操作
  • 除特殊情况外,空间复杂度要求一般与时间复杂度要求一致
  • 选择算法时,要根据题目给出的数据范围来判断可行的时间复杂度

常数时间复杂度 O(1)

特点:

执行时间与输入规模无关

典型事例

  • 变量赋值
  • 访问列表、字典某个索引的元素
  • 列表尾部的 append、pop 操作

代码示例

点击查看代码
def constant_time(lst);
    return lst[0]

典型数据范围

\(n \leq 10^{18} (或10^9)\)


对数时间复杂度 O(log n)

特点:

每次操作将问题规模按比例减小(通常是减半)

典型事例

  • 一个循环,其循环变量以乘法或除法方法式逼近边界

代码示例

点击查看代码
def logarithmic_time(n):
    i=1
    while i<n:
        i=i*2

典型数据范围

\(n \leq 10^{18} (或10^9)\)


线性时间复杂度 O(n)

特点:

执行时间与输入规模成正比

典型事例

  • 遍历列表
  • 列表的pop(O)操作

代码示例

点击查看代码
def linear_time(lst):
    for i in lst:
        print(i)

典型数据范围

\(n \leq 10^6 (或10^5,2\times10^6)\)


线性对数时间复杂度 O(nlog n)

特点:

通常是将一个 O(log n)的操作重复n次,或一个 O(n)的操作重复log n次

典型事例

  • 许多高效算法的标志性复杂度
  • 调和级数与线性结合:\(n \times(1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n})\)

代码示例

点击查看代码
def harmonic_example(n):
    s=0
    for i in range(n+1):
        for j in range (i,n+1,i):
            s+=1
    return s

典型数据范围

\(n \leq 2\times10^5 (或10^5)\)


\(n\sqrt{x}\)时间复杂度 \(O(n^{1.5})\)

特点:

复杂度介于线性对数和平方之间,通常出现在较复杂的分块或数学算法中

典型事例

  • 分块算法
  • 某些数论算法

代码示例

点击查看代码
def n_sqrt_nexample(n):
    for i in range(n):
	j=0
	while j*j<=i:
	    print(i,j)
	    j+=1

典型数据范围

\(n \leq 10^4\)


平方时间复杂度 \(O(n^2)\)

特点:

二重嵌套循环的典型复杂度

典型事例

  • 二重嵌套循环

代码示例

点击查看代码
def square_time(n):
    for i in range(n):
	for j in range(n):
	    print(i,j)

典型数据范围

\(n \leq 5000\)

立方时间复杂度 \(O(n^3)\)

特点:

三重嵌套循环的典型复杂度

典型事例

  • 三重嵌套循环

代码示例

点击查看代码
def cubic_time(n):
    for i in range(n):
	for j in range(n):
		for k in range(n):
		    print(i,j,k)

典型数据范围

\(n \leq 300\)


指数时间复杂度 \(O(2^n)\)

特点:

问题规模每增加1,执行时间翻倍,增长极快。

描述

常出现于解决一个问题的所有可能自己相关的问题中。

典型数据范围

\(n \leq 20\)


阶乘时间复杂度 O(n!)

特点:

极其低效,当n稍大时就无法在合理时间内完成

描述

常出现于需要考虑n个元素所有排列顺序的问题中

典型数据范围

\(n \leq 10\)

posted @ 2026-03-18 14:55  森鹿执夏  阅读(74)  评论(0)    收藏  举报