打表是典型的 空间换时间,一般指将所有可能需要用到的结果事先计算出来存入表,后面如果需要就直接查表。
常见方法有以下几种:
-
程序中一次性计算所有需要用到的结果,之后需要用到直接取
最常用的方法
如一个大量查询 Fibonacci 数 F(n) 的问题中,如果每次查询都要计算是很耗时的,假设查询 Q 次,时间复杂度即为 O(nQ)。如果进行预处理,即把所有的 Fibonacci 数预先计算并存在数组中,每次查询就只要 O(1),Q 次查询的时间复杂度 O(n+Q)
-
在程序 B 中事先算好需要用到的结果,然后手动把这些结果写在程序 A 的数组代码中,然后程序 A 中就可以直接使用
这种方法一般用在程序一部分过程消耗的时间过多,或者没有想到好的算法,因此在另一个程序中暴力求出结果
例如 n皇后问题,如果算法不好就容易超时,这是就可以在本地先算出 对所有 n 来说的方案数,然后把算出的结果直接写在数组中,就可以根据题目输入的 n 来输出结果
-
对一些感觉不会的题目,先用暴力计算小范围数据结果,然后找规律,也许就能发现一些“蛛丝马迹”
这种方法用于数据非常大时,因为这样的题目可能不是用直接就能想到的算法来解决的,而需要寻找一些规律
胡凡《算法笔记》