算法追求的理想就是完美

snakeguang 2010-02-23 11:01:50
算法追求的理想就是完美

魅力算法
——记邹恒明老师《算法》课程有感
原作:彭小朋*
有人天生喜欢“遍历”,踏遍千山万水,遍享万种风情。扮演各种角色,希望人生丰富多彩;有人一生“贪婪”,眼界不宽,及时行乐;有人注定适用“穷搜”,辛辛苦苦勤勤恳恳一辈子,付出很多,收获有限;有人善用“时空权衡”,用最少的时间办最多的事情,的确精明;有人会“分治”,再多的难题也能迎刃而解;有人常“回溯”,错的太多,后悔太多;有的人压根没有算法,于是盲目生活,盲目做事,最后所获无几;有人“动态规划”,从而积小成多。

从小时候就开始数了。
数到懂事,数到成熟,
还没有数清。
为什么天上的星星数不清呢?
像记忆和幻想,
永远背负着固执的迷……
---童年的歌

数数真的很难吗?
给你一个无限容积的罐子和无限个球,球从1开始连续编号。
在差1分钟到零点时:将标号为1到10的十个球放进罐子,然后将10号球从罐子拿出。
在差1/2分钟到零点时:将标号为11到20的十个球放进罐子,然后将20号球从罐子拿出。
在差1/4分钟到零点时:将标号为21到30的十个球放进罐子,然后将30号球从罐子拿出。
……
就这样将游戏进行下去。假定放球和取球不占时间,请问,当时钟指向零点时,罐子里剩有多少球?如果我们改变实验中的拿球方式,将每次拿10、20、30…号球分别变为拿1、2、3…号球,结果又怎样呢?……
对于很多人来说,算法就是解决问题的方法,具体来说就是一系列解决问题的步骤。这些步骤所推进的顺序和规则十分重要,就像上面的两个实验。只需将拿球的编号进行改动(拿球的顺序变换),结果就会大相径庭:第一种情况下罐子里剩有无限个球,第二种情况罐子里则没有球……
这个结果听上去似乎合理,因为拿球顺序的变化使得算法发生了变化,即我们实际上讨论的是两个算法。
可仔细一想又觉得不对,因为两个算法都是每次放进10个球,拿出1个球,即从根本上说,这是两个一样的算法,怎么会有截然相反的结果呢?难道标号的不同使最后的球的数量发生了变化?
没错。就是这个标号对结果产生了深远的影响。从某种意义上说,标号是虚的,它只存在于我们的想象中,但却确实对现实结果产生了影响。即我们的思维使得算法发生了变化。从这个意义上说,算法是一种思维方式(Algorithmic Thinking),或者说一种哲学,一种人生。
事实上,算法如人生,人生也如算法。它由许多过程所构成,又因这些过程而改变。虽然不能肯定结果正确,但求解过程却可以合理。透过算法的本质,我们可以看到芸芸众生,各色人相,多彩的生活。只要愿意,每个人都能寻找一个属于自己一生的独特“算法”,为自己的将来绘出一张或简单或复杂、或单调或反复、或直接或递归、或串行或并行、或随机或确定、或成功或失败(假如世界上存在所谓的成功和失败)的蓝图。
有人天生喜欢“遍历”,踏遍千山万水,遍享万种风情。扮演各种角色,希望人生丰富多彩;有人一生“贪婪”,眼界不宽,及时行乐;有人注定适用“穷搜”,辛辛苦苦勤勤恳恳一辈子,付出很多,收获有限;有人善用“时空权衡”,用最少的时间办最多的事情,的确精明;有人会“分治”,再多的难题也能迎刃而解;有人常“回溯”,错的太多,后悔太多;有的人压根没有算法,于是盲目生活,盲目做事,最后所获无几;有人“动态规划”,从而积小成多。
智者希望统筹兼顾,努力设计一个最优的人生。遇到一个大的工程,他们分而治之,治而合之。今天做一部分,明天做一部分,终究会做完。尽管有时效率不高,但总比一直放在那里,叹息发愁有意义。当一个问题的最优解,包含了子问题的最优解的时候,他们就选择动态规划,通过选择子问题的最优解,来构造源问题的最优解。
贪婪者希望运气长在,他们将每一次的选择缩小到一种贪心的选择。如果运气好,也许会成功;而在多数时候,却只会让人误入歧途。
智者千虑,必有一失。如果猛然发现自己做错了选择,不必恐慌,试试回溯吧,退回去,重新来过。在下一次的选择时,记得使用分支估界,从某些途径得到一些经验,来判断哪些路径不好。当然,我们也可以随机选择一些路径来实施,说不定能立竿见影。但总的来说,回溯不是万能的,人生的路,有时一旦走过,便无法返回。毕竟人生有限,频繁回溯,重做选择,就只有原地踏步的份了。分叉路口,做一个恰当的选择的确是困难的,在对与错、是与否、灵与肉、坚持与背叛、努力与放弃之间,我们需要细心。但一定要踏出下一步。至少,我们就可以知道它并不在这里。
有时候,生活中总会有那么一点无奈,无论你花多少力气,用多大的毅力,也不能产生效果。那是因为很多事情即使是可行的,也不一定是有意义的。所以聪明的人懂得用意念改变现实,用智慧区分可行和不可行,用信念辨别有意义和无意义。如果觉得生活太累,环节太多,试试跳转表吧,也许有些环节并不必须。如果觉得生活中某个步骤成本太高,试试平摊分析吧,也许我们别的步骤走得太过容易。如果时间珍贵,就试试完美哈希,直接将自己定位到目标上。不过记住,完美哈希并不完美,它的高昂代价也许你的灵魂承受不起。
智者用渐近分析获得问题的内在复杂性。当明了一个问题的计算时间下界,就可以评价解决该问题的各种算法的效率,进而确定对已有算法还有多少改进的余地。如果是P类问题,就奋力继续;如果遇到的是NPC,就找一个近似的最优解。就像大多数人都无法(不能或不愿)回避的找对象问题:每人的心中都有一个标杆(白马王子或白雪公主),想找到完全符合的并不容易,但也不能证明这个人不存在,这不就是NPC么?怎么解决?求近似解吧,在每一次的恋爱中逐步靠近那个标杆。
算法要求于至简。漫漫人生,相信每个人心中都有一个与生俱来的梦想,这是算法的灵魂——循环不变式。它或许会随着经历的不同而发生变化,但它在你心中的位置是不会变的。位置有远有近,到达的路途有平坦有崎岖,那又有什么关系?当你实现了最初的梦想,所有的循环终将定位在最美的一霎——那便是永恒不变的信念。
在人生的成长过程中,糊里糊涂的人过着糊里糊涂的生活,不知道自己离心中的那个位置是越来越近,还是渐行渐远。而聪明人算法庞大却精妙,因为他们常常反省自己,检查这个不变式,不断简化,每一步都坚定迈向至简,即便是 “劝君更尽一杯酒,西出阳关无故人” 的独自前行。
算法终将归于永恒。人生的算法林林总总。有人天生智慧、美丽,有人生来愚笨、丑陋。你并不需要为此庆幸、骄傲,或者伤心、气馁,甚至抱怨上帝的不公。这些是无用,也是不必要的。因为如果一个算法足够健壮,初始条件带来的影响几乎是微不足道的。我们感到疲惫不堪,精疲力竭和毫无乐趣的,通常并非繁重的人生,而是没有意义和希望的人生。因为“没有目标的算法无法向正确推进。”
不同的算法演绎不同的人生。它的影响不限于今世,而是达于另一个维度。世俗精彩过眼消散,万种风情终将逝去。意识到这点,我们突然发现,过去看重的很多活动,目标,追求,甚或其他问题,都突然显得微不足道和不值一提。我们会重新订立优先次序,将算法的目标锁定为永恒做准备,升华我们的灵魂。因为这个算法将是我们面对造物主的终极答卷。
一花一世界,一叶一菩提。算法,一段神奇的代码,演绎一段传奇的人生,锁住一段永恒的痕迹。理解算法、把握人生,让我们用算法的一生,刻印下我们一生的算法,在没有时间的星空循环往复,留下我们那 “莫愁前路无知己,天下谁人不识君!”的不灭印记。这就是求于至简,归于永恒的境界……
精彩内容来自:《算法之道》2010年最值得看的算法图书之一
购买地址:http://www.china-pub.com/196344

...全文
192 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
enter333 2010-04-22
  • 打赏
  • 举报
回复
好文
好长。
建议贴个目录出来看看。
it521 2010-04-09
  • 打赏
  • 举报
回复
楼主 你想说撒子?太长了 没看完
验证码识别 2010-03-25
  • 打赏
  • 举报
回复
up

up

1,978

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧