不求完美,但求够好
上回你看到了:有些问题情况会爆炸,要把完美答案查到底,得花一辈子。那就放弃吗?倒不一定。就算拿不到完美答案,“够好的答案”往往很快就能拿到。让一点点,省下一大把时间。
先把完美放一放
有个难题。
要找完美答案,
就得把每种情况都查一遍,
而那个数大得吓人。
查到底,
确实会得出最好的答案。
可那
到底什么时候才查完?
按一下数数看。
把完美答案查到底。(情况一涨,时间就爆炸 → 看不到头)
数涨得太快了。
才多几个,
要查的就多出好几倍。
所以等着完美答案
查到底,
有时并不现实。
可话说回来,
也不能就这么撒手。
够好的答案,要快
这儿有个想法。
要是不必非得
是最好的呢?
不去冲着完美,
就快快地
抓出一个
“还不错的答案”。
就像贪心里那样,
把眼前好的
一个个利索地挑出来。
快速的粗略答案 vs 完美答案。(粗略的一下就有 · 差距很小)
你看。
粗略答案眨眼就出来了,
可跟完美答案
差不了多少。
稍微差一点,
却很好用。
很多时候,
这就够了。
它保证有多好
不过有个担心。
那个“还不错的答案”,
真能信吗?
万一它其实
糟得很,怎么办?
所以聪明的方法
会连个保证一起给。
它说:“这个答案
不会比最好的
差太多。”
保证在最优的 1.5 倍以内。(不管出什么答案都在这条线内 → 最坏被挡住了)
这才是真正妙的地方。
划一条线,
比如“在最优的 1.5 倍以内”,
那答案再差,
也过不了那条线。
虽不完美,
可它能差到哪儿,
我们清清楚楚。
这跟瞎猜,
完全是两回事。
拿准度换时间
说到底这是一杆秤。
多花时间,
答案就更准;
省时间,
答案就糙一点。
哪边好,
没法一口咬定。
急了就要快的那边,
要精就要准的那边。
挪一挪把手,
在两者之间挑一处。
多花时间更准,少花时间没那么准。(在哪儿停下,由我们来挑)
这杆秤,
是整个算法的心。
快的路和准的路,
简单的路和细致的路。
每一回,我们都在
挑要让出什么、
要换回什么。
懂一个好方法,
就是会读这杆秤。
走到这里的路
我们走了好长一段路。
从按顺序解题开始,
排队、查找、
量成本、
拆分、连接、挑选。
我们看到有些问题真的难,
也看到即便如此,
够好的答案是存在的。
按一下,把这条路
一口气回看一遍。
这个领域给的四样东西。(好方法 · 快 · 策略 · 懂极限再权衡)
我们没法把每个问题
都解得完美。
可这并不意味着
我们就无能为力。
用快的方法、
聪明的策略,
懂得极限再明智地权衡,
哪怕站在难题面前,
也能把一个好用的答案
握在手里。
这,就是算法
给我们的力量。