n0irzzz
数学小论文~

数学小论文~

浅析微积分在算法时间复杂度分析中的应用

摘要:计算机的核心在于算法,而计算机科学与软件工程的重要目的在于寻求更高效率的算法。一般而言,我们想要在算法功能不变的情况下,让计算机占用更少的内存资源,用更短的时间完成算法。本文立足于《高等数学A》课程内容,以基础的排序算法为例,从极限理论出发,解释算法时间复杂度的大 $O$ 表示法,通过洛必达法则精确比较算法增长量级;利用定积分与分部积分法推导斯特林公式,从而证明排序算法的时间复杂度下界。本文旨在揭示微积分工具在计算机科学中不可替代的理论价值。


二、算法复杂度的数学定义与建模

以简单的排序算法为例:将一个数列排序为单调递增数列。
我们构建了以下两种排序算法的 C++ 实现进行对比测试:

1. 冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void bubbleSort(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) swap(arr[j], arr[j + 1]);
}
}
}
````

### 2\. 快速排序实现

```cpp
void quickSort(vector<int>& arr, int low, int high) {
if (low >= high) return;
int pivot = arr[high], i = low - 1; // 选取基准
for (int j = low; j < high; j++) {
if (arr[j] < pivot) swap(arr[++i], arr[j]);
}
swap(arr[i + 1], arr[high]);
int pi = i + 1; // 分区
quickSort(arr, low, pi - 1); // 递归左半部分
quickSort(arr, pi + 1, high); // 递归右半部分
}

实验结果

数据量(n) 冒泡排序耗时 快速排序耗时(秒) 性能倍数差
10,000 0.21 s 0.002 s 100倍
40,000 3.52 s 0.008 s 440倍
100,000 Tle (超时) 0.015 s -

当数据规模较小时(如 $n=100$),两者的运行时间差异几乎不可感知。然而,当数据量增加到 $n=40000$ 时,实验数据显示:冒泡排序耗时约 3.5 秒,而快速排序仅需 0.008 秒,前者耗时是后者的数百倍。

如果我们将算法的“运行时间”抽象为“基本运算次数”的函数 $T(n)$,这就将一个工程问题转化为了数学问题:如何比较函数 $T_{1}(n)$ 与 $T_{2}(n)$ 在 $n\rightarrow\infty$ 时的增长快慢?

定义:设 $T(n)$ 与 $f(n)$ 是定义在正整数集上的两个无穷大函数。若存在非零常数 $C$,使得:
$$\lim_{n \to \infty} \frac{T(n)}{f(n)} = C \quad (0 < C < \infty)$$
则称 $T(n)$ 与 $f(n)$ 是同阶无穷大,记作 $T(n)=O(f(n))$。这表明 $T(n)$ 的增长速率与 $f(n)$ 保持线性比例关系。


三、模型构建与复杂度计算

我们对两种排序的时间复杂度进行计算。

1. 冒泡排序

冒泡排序通过相邻元素的比较与交换将最大值“冒泡”至顶端。其核心逻辑由双层嵌套循环构成。设 $n$ 为数组长度,外层循环执行 $n-1$ 次,内层循环第 $i$ 次执行 $n-i$ 次比较。总运算次数函数 $T_{bubble}(n)$ 可由等差数列求和公式得出:

$$T_{bubble}(n) = \sum_{i=1}^{n-1}(n-i) = (n-1) + (n-2) + \dots + 1 = \frac{n(n-1)}{2} = \frac{1}{2}n^2 - \frac{1}{2}n$$

根据大 $O$ 定义,我们需要计算 $T(n)$ 与 $n^2$ 的比值极限:
$$\lim_{n \to \infty} \frac{T_{bubble}(n)}{n^2} = \lim_{n \to \infty} \frac{\frac{1}{2}n^2 - \frac{1}{2}n}{n^2} = \lim_{n \to \infty} (\frac{1}{2} - \frac{1}{2n}) = \frac{1}{2}$$
由于极限存在且为非零常数 $(C=1/2)$,严格得证:$T_{bubble}(n) = O(n^2)$。

2. 快速排序

快速排序采用分治策略。在平均情况下,每次划分将规模为 $n$ 的问题分解为两个规模为 $n/2$ 的子问题,外加 $cn$ 次的比较操作。其时间复杂度满足递归方程:
$$T(n) = 2T(\frac{n}{2}) + cn$$

利用展开递归树求解:

  1. 第 0 层:处理规模为 $n$,耗时为 $cn$。
  2. 第 1 层:分裂为 2 个规模为 $n/2$ 的子问题,总耗时为 $2 \times (c \cdot \frac{n}{2}) = cn$。
  3. 第 2 层:分裂为 4 个规模为 $n/4$ 的子问题,总耗时为 $4 \times (c \cdot \frac{n}{4}) = cn$。
    由于数据规模每次减半,递归树的总高度为 $h = \log_2 n$。

总的时间复杂度为:
$$T(n) = \sum_{i=0}^{\log_2 n} cn \approx cn \log_2 n$$

利用换底公式 $\log_2 n = \frac{\ln n}{\ln 2}$,验证其属于 $O(n \log n)$:
$$\lim_{n \to \infty} \frac{T_{quick}(n)}{n \ln n} = \lim_{n \to \infty} \frac{cn \cdot \frac{\ln n}{\ln 2}}{n \ln n} = \frac{c}{\ln 2}$$
极限收敛于非零常数,故 $T_{quick}(n) = O(n \ln n)$。


四、渐进复杂度比值的极限性质与实例验证

1. 理论推导

我们证明:计算大 $O$ 复杂度函数的比值极限,等价于比较真实运行时间的增长趋势。
设真实时间复杂度为 $T_1(n), T_2(n)$,对应的渐进复杂度函数为 $f(n), g(n)$。
$$R = \lim_{n \to \infty} \frac{T_1(n)}{T_2(n)} = \left( \lim_{n \to \infty} \frac{T_1(n)}{f(n)} \right) \cdot \left( \lim_{n \to \infty} \frac{g(n)}{T_2(n)} \right) \cdot \left( \lim_{n \to \infty} \frac{f(n)}{g(n)} \right)$$
结论:若 $\lim_{n \to \infty} \frac{f(n)}{g(n)} = \infty$,则真实时间比值 $R$ 必趋于 $\infty$。这赋予了我们直接利用简洁函数进行效率比较的数学合法性。

2. 实例验证与结果分析

已知冒泡排序 $f(n)=n^2$,快速排序 $g(n)=n \ln n$。
$$\lim_{n \to \infty} \frac{n^2}{n \ln n} = \lim_{n \to \infty} \frac{n}{\ln n}$$
该极限属于 $\frac{\infty}{\infty}$ 型未定式,使用洛必达法则:
$$= \lim_{n \to \infty} \frac{(n)’}{(\ln n)’} = \lim_{n \to \infty} \frac{1}{1/n} = \lim_{n \to \infty} n = +\infty$$
这一数学结论严谨地解释了实验现象:$T_{bubble}(n)$ 是 $T_{quick}(n)$ 的高阶无穷大。任何物理层面的优化都无法填补由 $O(n^2)$ 与 $O(n \log n)$ 阶数差异带来的巨大鸿沟。


五、积分与斯特林公式:基于比较的排序算法下界证明

1. 问题的提出

是否存在一种基于比较的排序算法,其时间复杂度能突破 $O(n \log n)$ 达到 $O(n)$?
对于 $n$ 个待排序元素,其全排列共有 $n!$ 种。任何基于比较的排序算法,本质上都是一棵决策树,其深度至少为 $\log_2(n!)$。

2. 离散求和的连续化处理与斯特林公式

利用对数性质:$\ln(n!) = \sum_{k=1}^{n} \ln k$。
利用定积分逼近离散级数:$\sum_{k=1}^{n} \ln k \approx \int_{1}^{n} \ln x , dx$。

采用分部积分法求解 $\int \ln x , dx$:
令 $u = \ln x, dv = dx$,则 $du = \frac{1}{x}dx, v = x$。
$$\int_{1}^{n} \ln x , dx = [x \ln x - x]_{1}^{n} = (n \ln n - n) - (1 \cdot \ln 1 - 1) = n \ln n - n + 1$$
忽略低阶项,得到斯特林公式的对数形式:$\ln(n!) \approx n \ln n - n$。

3. 结论

$$\log_2(n!) = \frac{\ln(n!)}{\ln 2} \approx \frac{1}{\ln 2}(n \ln n - n) \in O(n \log n)$$
这意味着,任何基于比较的排序算法,其最坏情况下的时间复杂度下界必然是 $O(n \log n)$。微积分工具不仅能分析已知算法,更能预言未知算法的理论边界。


六、结语

综上所述,高等数学并非象牙塔中脱离实际的纯理论构建。从利用极限定义算法复杂度的边界,到运用洛必达法则判定不同量级函数的增长趋势,再到借助定积分与分部积分法推导算法效率的物理下界,微积分的思维贯穿了算法分析的始终。


参考文献

[1] 华东师范大学数学科学学院、高等数学(上册)[M]. 上海: 华东师范大学出版社, 2022.
[2] Thomas H. Cormen, Charles E. Leiserson, et al. 算法导论(原书第3版)[M]. 北京: 机械工业出版社, 2013.
[3] 严蔚敏, 吴伟民, 数据结构(C语言版)[M]. 北京: 清华大学出版社, 2011.

本文作者:n0irzzz
本文链接:https://yokari.cn/2025/12/09/math-paper/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可