编程语言与排序算法

原创
2016/08/04 10:54
阅读数 197

我在工作中用过好几种编程语言,虽然它们都是图灵完备的,但物以类聚、人以群分,编程语言的社区各自都有非常鲜明的特色。忽然意识到这些特点与排序算法给人的印象颇有几分相似!下面请看我如何把牛皮吹得清新脱俗:

介绍的顺序不代表优劣。

Java社区:堆排序

Java社区给我的印象是中规中矩、以不变应万变。无论是写“Hello World”、还是搭建一套淘宝系统,无论是高手、还是菜鸟,最终的代码都逃不开那些条条框框。

以JDBC接口为例,做一次查询依次要获得 Connection->Statement->ResultSet。无论你是查一行、带条件、带外部参数……无论哪种场景都是固定的模式。Java社区在设计API的时候也许根本不考虑“二八法则”:不会为20%的、常用的功能(例如简单查询)额外提供一个更简便的接口。

这个现象因“约定大于配置”等得到了一些改善,但特征依旧鲜明。

这个特点与堆排序非常吻合:无论是已经接近排好序的数列、还是完全混乱的数列,堆排序的最好与最坏的效率统一是O(nlog2n),始终按照自己的节奏一步步排序,不会因为已经部分排好序而开后门。

Perl社区:插入排序

Perl社区的特色与Java几乎是截然相反!它在处理字符串这一件事情上精益求精,而在其他事情上处理的匪夷所思。例如嵌套的数列(如 (1,2,(3,(4))))会自动被展开成一维数列 (1,2,3,4)。

这个特点与插入排序很像,在处理已经基本排好序的数列时,它几乎比所有其他的算法都快;但处理其他情况就不太理想。

PHP社区:希尔排序

PHP是Perl针对Web场景的改良版,也完美地继承了Perl的特色,在Web开发领域几乎稳坐头把交椅。

PHP社区给我的印象是“快速原型”:很多网站的第一版本、演示项目等都献给了PHP。你可以从零开始做、也可以给予Laravel等框架开发、还可以基于WordPress等系统做二次开发,PHP社区为你提供了丰富的工具来快速实现想法。

PHP源自Perl并青出于蓝,就像希尔排序源自插入排序但效率得到提升,因此我把PHP类比成希尔排序。

Ruby社区:快速排序

Ruby社区给我的感觉是创意无限!我最初接触Ruby并不像大多数人一样因为Rails,而是因为诸如Homebrew、Jekyll等由Ruby开发的命令行小工具。在不断深入这个社区时,发现这个社区的成员各个都充满了创意,他们总能带给我眼前一亮的新鲜玩意儿。

用Ruby很讲究悟性,就像禅一样。这一点和快速排序很像,你想要理解快速排序,就需要理解“分治”的本质;而一旦理解了“分治”算法,就可以不局限于快排这一种算法,还能举一反三把分治运用到各种场景。就像悟道了一样,无论最后是否在用Ruby编程,你心中以后有了一把衡量程序优雅的尺子。

JavaScript社区:归并排序

前几天刚刚吐槽过JavaScript,今天又来感觉真不好意思~JavaScript社区给我的印象就四个字——奇技淫巧!从++[[]][+[]]到 Linux模拟器,从前端到后端,从PC到手机……JavaScript到处宣誓自己无所不能、无孔不入!

归并排序的经历也很类似,一开始因为耗空间并不特别吃香;到了大数据、MapReduce等场景它几乎成了唯一的选择,归并思想上天入地无所不能!和JavaScript借助V8引擎崛起几乎是一个模子里刻出来的。

Clojure社区:基数排序

Clojure社区、或者说整个Lisp社区,乍一眼看把括号括到死的气势、清新脱俗地前缀表达式,就能让你体会到它不是你所熟知的事物。就像第一次遇到线性代数一样:所有的数字与加减乘除符号全部认识,但这句表达式是什么意思就完全不明白。

Lisp就像打破排序算法时间下界的线性时间排序算法一样不按常理出牌,基数排序跳出了比较+交换的排序思维框架,出其不意地把效率提高了一个数量级;Lisp抛弃了语法,允许使用宏把语言改造成需要的/喜欢的形式,在Common Lisp中甚至词法都可以DIY,这种剑走偏锋让Lisp具备了非凡的生产力。

Clojure是集Lisp和JVM大成者,包含了 Lisp 的简洁、也融入了 JVM 的实用。Clojure 的库重复的轮子并不多,但每个轮子都能把它应该做的事情做到极致!例如Leiningen,一个工具就包含了Java的Maven、Ruby的Gem、Python的pip等所有功能。Leiningen 的 uberjar 指令输出的是真正的 Uberjar:把所有依赖的 class 文件打包进同一个 jar 包,而不是像有些构建工具取巧把依赖的第三方 jar 包塞到 lib 目录下。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部