CS61B 课程笔记(Lecture 35 Sorting and Algorithmic Bounds)

排序与算法的理论界限(Lecture 35)

本节主要讨论了排序问题的理论界限,重点在于基于比较的排序算法的下界。通过讲解“猫狗排序游戏”和其他相关数学证明,说明了为什么任何基于比较的排序算法在最坏情况下无法超越 \(\Theta(N \log N)\) 的时间复杂度。

1. 排序问题的重要性

  • 排序是计算机科学中的基础问题,不仅用于将元素按顺序排列,还能用于优化其他问题的效率。
  • 例如:
    • 在寻找重复元素时,排序可以将时间复杂度从 $ O(N^2) $ 降到 $O(N N) $。
    • 解决 3SUM 问题时,排序可以将时间复杂度从 \(O(N^3)\) 降到 \(O(N^2)\)

2. 基于比较的排序算法的理论下界

  • 已知一些排序算法(如归并排序、堆排序)的最坏情况时间复杂度为 \(\Theta(N \log N)\) ,问题在于是否存在更快的算法。
  • 基于数学证明,我们可以得出任何基于比较的排序算法的最坏情况下界是 \(\Omega(N \log N)\) ,这意味着不存在比 $ (N N) $ 更快的基于比较的排序算法。

3. 排序的稳定性

  • 排序的稳定性是指:在排序过程中,如果两个元素的值相等,排序后它们的相对位置不发生变化。
  • 例如:
    • Java 中的 Arrays.sort() 在对对象数组进行排序时使用稳定的 TimSort(归并排序的一种变体)。
    • 但在对基本类型数组进行排序时使用的是不稳定的快速排序,因为基本类型之间没有多种排序方式。

4. 基于比较的排序下界的数学证明

  • 猫狗排序游戏

    • 设想有三只动物(Tom 猫、Jerry 鼠、Spike 狗)分别装在不透明的盒子 A、B 和 C 中,目标是通过比较重量来确定每只动物的位置。
    • 如果知道 A 盒比 B 盒轻,且 B 盒比 C 盒轻,就可以确定它们的排序。
    • 但有时两个不等式不足以确定唯一的排序,需要额外的信息。比如:A 比 B 轻,B 比 C 重时,需要第三个不等式(如 A 比 C 轻)来解决问题。
  • 通过这类“比较”问题可以建立一棵二叉树,树的叶子节点代表所有可能的排序结果。对于 N 个元素,有 \(N!\) 种可能的排序方式,因此至少需要 \(\log(N!)\) 次比较来确定正确的排序。

  • 数学上,通过 Stirling 公式近似 \(\log(N!) = \Theta(N \log N)\) ,得出结论:任何基于比较的排序算法最坏情况下至少需要 $(N N) $ 次比较。这意味着基于比较的排序算法无法做到比 $ (N N) $ 更快。

5. 排序的结论

  • 理论界限:无论是现有的排序算法(如快速排序、归并排序)还是假设存在的“最优排序算法”,其最坏情况下的时间复杂度都不可能低于 \(\Theta(N \log N)\)
  • 稳定性与排序算法的选择:对于稳定排序,归并排序是一个不错的选择;对于不需要稳定性的排序,快速排序在许多情况下表现更好。

6. 数学问题总结

  • 数学问题 1:证明 \(N! \in \Omega(N^2)\)
  • 数学问题 2:证明 \(\log(N!) \in \Omega(N \log N)\) 且 $N N ((N!)) $。
  • 最终推导出 $(N!) (N N) $。

通过“猫狗排序游戏”以及相关的数学证明,讲解了基于比较的排序算法的下界,并说明了为什么任何基于比较的排序算法无法突破 \(\Theta(N \log N)\) 的时间复杂度。这为我们提供了排序算法的理论基础。