文档章节

编程语言与排序算法

redraiment
 redraiment
发布于 2016/08/04 10:54
字数 1481
阅读 95
收藏 0

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

介绍的顺序不代表优劣。

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

© 著作权归作者所有

redraiment

redraiment

粉丝 130
博文 23
码字总数 36572
作品 6
杭州
架构师
私信 提问
课程 | 利用 TensorFlow 实现排序和搜索算法

在 TensorFlow 更新到 1.3 版本之后,新添加了类似于一般编程语言的判断语句和循环语句,从而我们可以在 TensorFlow 图汇总实现类似于 C 语言或者 Python 语言的排序算法和搜索算法。本场 ch...

chen_h
2017/10/26
0
0
排序算法 Sleep Sort

排序算法好像是程序员学习编程最多的算法,也可能是算法研究者们最喜欢研究的算法了。排序有很多很多的算法,比如,冒泡,插入,选择,堆,快速,归并等等(你可以看看本站以前的那些文章:可...

小卒过河
2011/06/23
1K
2
学习数据结构与算法,成为出色的程序员

原文出处:Happy Bear 译文出处:LCTT - icybreaker “相较于其它方式,我一直热衷于推崇围绕数据设计代码,我想这也是Git能够如此成功的一大原因[…]在我看来,区别程序员优劣的一大标准就在...

Happy Bear
2015/11/10
0
0
经典排序之 冒泡排序

Author: bakari Date: 2012.7.30 排序算法有很多种,每一种在不同的情况下都占有一席之地。关于排序算法我分“经典排序之”系列分别述之。本篇为冒泡排序。 冒泡排序是最古老的排序,我们最早...

chambai
2012/08/11
0
0
问答|Go sort包使用与源码剖析

目录 包方面 sort包里包括哪些文件 sort.go如何使用,有什么需要注意的地方 example*test.go格式的文件是做什么用的 slice.go如何使用,有什么需要注意的地方 search.go如何使用,有什么需要...

Go中国
05/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 文件类操作API与IO编程基础知识

阅读目录: https://www.w3cschool.cn/java/java-io-file.html Java 文件 Java 文件 Java 文件操作 Java 输入流 Java 输入流 Java 文件输入流 Java 缓冲输入流 Java 推回输入流 Java 数据输入...

boonya
38分钟前
5
0
SDKMAN推荐一个好

是在大多数基于Unix的系统上管理多个软件开发工具包的并行版本的工具。它提供了一个方便的命令行界面(CLI)和API来安装,切换,删除和列出sdk相关信息。以下是一些特性: By Developers, fo...

hotsmile
今天
9
0
什么是 HDFS

是什么? HDFS 是基于 Java 的分布式文件系统,允许您在 Hadoop 集群中的多个节点上存储大量数据。 起源: 单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在集群上的文件系统称...

Garphy
今天
5
0
一起来学Java8(四)——复合Lambda

在一起来学Java8(二)——Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda。 Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用Lambda表达式实现函...

猿敲月下码
今天
11
0
debian10使用putty配置交换机console口

前言:Linux的推广普及,需要配合解决实际应用方能有成效! 最近强迫自己用linux进行实际工作,过程很痛苦,还好通过网络一一解决,感谢各位无私网友博客的帮助! 系统:debian10 桌面:xfc...

W_Lu
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部