編程語言與排序算法

我在工做中用過好幾種編程語言,雖然它們都是圖靈完備的,但物以類聚、人以羣分,編程語言的社區各自都有很是鮮明的特點。突然意識到這些特色與排序算法給人的印象很有幾分類似!下面請看我如何把牛皮吹得清新脫俗:前端

介紹的順序不表明優劣。算法

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 目錄下。

相關文章
相關標籤/搜索