两个数据. 问题和算法(包括数据结构) 问题是规定的 input 和 output 的. (数据结构类问题稍微复杂一点) 每个算法都是解决一个特定问题的.
- 问题图: 对于 B 问题的 input 的 restriction 获得问题 A, 则 A 是 B 的特例, 则 B 的算法都能用在 A 上. 问题之间的特例关系是个有向无环图.
- 问题 x 算法图:
- 问题->算法: 每个问题, 有些解决它的算法.
- 算法->问题: 算法的里面有 subroutine, 是解决个问题的 oracle.
- 问题 x 算法图: 建立在上面的有向二分图. 这个图上, 是可能有环的.
几大重要功能
-
特例的 inheritance. 难度 ★ : 比如问题 A 里, 有个特例是 B. 这里录入 B 的时候只需要说 inherit A. 然后只需要增加不一样的东西. 这样原先可以使用在 A 的算法现在还能使用在 B. 是的这非常 OO.
-
自动计算复杂度. 难度 ★★ : 比如 一个解决问题 A 的一个算法其中要跑解决问题 B 的算法 n 次. 而跑的时候给 B 的算法的 input 的大小是 n^2. 则这个算法的时间复杂度是 O(n T(n^2)), T(n)是 input 大小为 n 的时候 B 要跑的时间. 显示真实时间的时候可以从数据库里, 找到所有 B 问题的算法, 每一个时间复杂度塞进去, 然后求 min. 好处是哪一天某个问题获得了新算法, 可以自动更新其他问题最快的算法.
-
时间复杂度排序. 难度 ★★★★★
- asymptotic analysis. 比如计算出了 O(m^2)和 O(m)的算法, 哪一个快可以自动的获得. 而不用现在手动的去计算究竟哪个更快. 这个暂时可以用 SAGE 的 asymptotic expansion 功能. 它们应该足够好能自动化大多 comparison 了.
- 更高级的分析. 比如可以加上约束, 如 m = O(n^2)这样的约束.