题记——千里杀一人

来源:互联网 发布:sql server denty_rank 编辑:程序博客网 时间:2024/06/05 10:42

有一天跟老婆一起读唐诗,看到李白的侠客行:


赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。
十步杀一人,千里不留行。事了拂衣去,深藏身与名。
闲过信陵饮,脱剑膝前横。将炙啖朱亥,持觞劝侯嬴。
三杯吐然诺,五岳倒为轻。眼花耳热后,意气素霓生。
救赵挥金锤,邯郸先震惊。千秋二壮士,烜赫大梁城。
纵死侠骨香,不惭世上英。谁能书阁下,白首太玄经。


然后有以下对话:

我:你最喜欢哪一句?

老婆:“千里杀一人”那句。

我:你是说“十步杀一人,千里不留行”?

老婆:对。


后面的对话是讨论诗本身了。然而当时我脑海里立刻想到的是:将“十步杀一人,千里不留行”精简为“千里杀一人”,虽然变短了,却带来了严重的性能问题。之前按十步一人算,千里可以杀好多人,而现在只杀一人,效率大大降低。降低多少呢?假设一步为0.5m,之前千里可以杀100000人,现在是1人,十万倍!

算法常常是这样的。一段归并排序的代码跟选择排序相比,虽然长了一些,却在基数足够大的情况下确实可以带来100000倍的性能提升。在技术上,一旦遇到的性能问题,常见的思路就是用更复杂的代码来改善性能。比如数据库查找不够快,我们可能会去加索引。而索引的本质就是维护一个数据结构(常常是B-Tree),在搜索的时候利用这个数据结构快速定位到要找的数据。于是更加复杂的代码(索引的维护和利用)带来了性能的飞跃。

复杂的算法绝不是能用一句话说清楚非要用三句话来说,而是在没有代码冗余,没有精简的余地时,有更多的处理逻辑和更精密的数据结构。一些精妙的算法确实精简的堪比艺术品,然而其背后的思想和推导过程绝非想当然地就能得到。解决一些现实问题常常不得不把一些简单的概念复杂化。从扁平结构到关系结构,从直接获取到使用代理,从单点到集群等等,举不胜举。

然而,这正是程序员的使命:面对渐渐浮现的,或者未来即将出现的复杂问题,分析,建模,解决掉它们。在技术的道路上,真的猛士敢于直面复杂的问题,写下精简的代码。


0 0
原创粉丝点击