算法分析与数据可视化:从理论到实践
1. 运行时间分析
假设给定平面上的 $n$ 个点。在步骤 1 中,使用随机分治算法可以在 $O(n)$ 时间内找到将集合划分为两个等大小子集的中位数点。创建子集 $L$ 和 $R$ 也是一个 $O(n)$ 时间的操作。解决两个大小为 $\frac{n}{2}$ 的子问题后,算法在 $O(n)$ 时间内选择属于中间条带的点。之后,对这些过滤后的点进行排序需要 $O(n \log n)$ 时间。最后,在这个条带内计算距离需要 $O(n)$ 时间(对于每个点执行固定量的工作)。
对于任何函数 $f = kn$,$k \in \mathbb{N}$,都有 $f = O(n)$,即它由某个线性函数界定。因此,无论连续执行 $O(n)$ 操作多少次,或者执行 $3n$、$5n$ 或 $7n$ 次操作,它们的总效果都算作 $O(n)$。总体而言,运行时间由递归公式 $T(n) = 2T(\frac{n}{2}) + O(n \log n)$ 定义。虽然不能直接应用主定理,但可以借鉴其思想来分析这个表达式。
如果绘制递归树,在任意级别 $k$ 上,树的贡献为 $t_k = 2^k \cdot \frac{n}{2^k} \log \frac{n}{2^k}$。树的深度为 $\log n$,通过对每一级的贡献求和,最终得到 $O(n \log^2 n)$。
在步骤 3 中,反复按 $y$ 坐标对节点进行排序,这导致了额外的 $\log n$ 乘数。如果能避免这种排序,只在开始时进行一次,那么运行时间将降低到 $O(n \log n)$。从新的递归关系 $T(n) = 2T(\frac{n}{2}) + O(n)$ 可以明显看出这一点,因为可