没有计算机的时代,数据如何排序?

232 阅读6分钟

数据排序已经成为我们日常生活中必不可少的一个环节。在电子表格和数据库中,排序操作只需要简单的一两步即可完成。

随着计算机技术的快速发展,现代人对于数据排序已经形成了一种无感知的状态,邮件已按时间排好,购物车里的商品也早已排好,不需要特别的操作。

然而,我们回顾计算机的发展历程时,会发现排序问题曾是计算机领域中的一个重要问题。

在计算机发展初期,排序占据了绝大部分的计算资源,有时候甚至让人觉得,计算机不是为了解决计算问题而生,而是为了解决排序问题而生。

为了更深入地观察这个问题,让我们回到计算机诞生前夕,探寻在没有计算机的时代,人们是如何进行数据排序的。

IBM 打孔机

在 19 世纪末期,美国人口每年以 30% 的速度增长。1870 年,美国人口普查只涉及 5 个“调查科目”,到了 1880 年则增加到了 200 多个。完成 1880 年的人口普查花费了 8 年时间,因此处理大量数据成为当时亟待解决的问题。

于是,打孔机应运而生,为数据处理提供了巨大的便利。

IBM 29 Card Punch

1928 年,IBM 推出了标准的80列、矩形孔卡片,该卡片成为了当时数据处理的事实标准。

然而,我们来到这里的目的并不是为了复习历史,而是想了解打孔卡片(数据)的一些细节。

首先,我们需要了解打孔卡片的工作原理:每个卡片由 10 行编号为 0 至 9 的区域组成,以及一块区域,用于第 11 行和第 12 行(注意,没有编号为第 10 的行)。

IBM Punch Card

每列的穿孔组合用于表示单个字符:

  • 数字通过在行 0 至行 9 中直接打一个孔来表示。
  • 字母需要两个孔来表示:一个在第 11、12 和 0 行,另一个在第 1 至 9 行。

比如数字 1 可以这么打孔:

IBM Punch Card 1

字母 A 可以这么打孔

IBM Punch Card A

下面这段视频可以让你感受一下当年在卡片上打孔的操作过程:

www.youtube.com/watch?v=Ynn…

IBM Sorter

面对一堆打好的卡片(数据),如何进行排序呢?

例如,我们希望将一叠卡片按照年龄进行排序。年龄的数据在卡片上可能占两列,一列为十位数,一列为个位数(为了描述方便,就不考虑百岁以上老人)。

IBM 提供用于对打孔卡片进行排序的机器 IBM Sorters。

IBM Type 82 Sorter

IBM Sorter 有 13 个口袋,其中 12 个口袋对应卡片的 12 行,还有 1 个口袋用于空白、拒绝和错误。

在机器运行之前,需要确定要排序的列。例如,我们可以确定首先排序的列是年龄个位数所在的列,然后运行机器。

所有的卡片会按照年龄个位数从小到大依次掉到不同的口袋里。例如,年龄个位数为 0 的卡片会掉到一个口袋,年龄个位数为 1 的卡片会掉到另一个口袋,以此类推。

接下来,将年龄个位数排好序的卡片再次排序,这次需要将排序的列调整到年龄十位数所在的列。

这次所有年龄在 10-19 岁的会掉到一个口袋里,所有年龄在 20-29 岁的会掉到一个口袋,以此类推。

将不同口袋的卡片按序收集起来,就可以完成对所有年龄的排序。

熟悉排序算法的朋友,一定会发现这很像基数排序(Radix Sort)的思想。

[IBM Type 82 Sorter Working]: www.youtube.com/watch?v=RPO…

除了 IBM Sorter,IBM 还开发了一款叫做 IBM Collator 的机器。这种机器的功能类似于合并算法,可以将两堆已排序好的卡片合并成一堆。

冯诺依曼后来为了验证计算机是速度比机器快,就写了一个合作算法跟 IBM Collator 进行比较,详情请看:# 冯·诺依曼的第一个计算机程序是怎么做出来的?

IBM 088 Collator

这种机械式的排序方法虽然效率不高,但它为我们提供了一种重要的思路,即利用机器来完成大规模数据的处理。

二战时期,德国纳粹是 IBM 的重要客户。也就是说当时最先进的人口统计系统,曾经被纳粹用于管理犹太人。虽说技术无关政治,但这的确是 IBM 永远抹不掉的污点。

最后

回顾历史,我们发现在计算机还没有出现的时代,数据已经开始爆炸式增长了,排序当然就变成了一项相当复杂和耗时的任务。

计算机的出现,改变了数据的存储方式,也为数据排序带来了一次革命,使得数据处理变得更加高效和准确。

从最初简单的冒泡排序、插入排序、到后来复杂的合并排序、快速排序、桶排序,排序算法的发展历程也见证了计算机技术的不断进步和演变。

如果你想了解排序算法的历史演变,关注我,接下来的文章将会带你深入探索其中奥秘。

参考资料:

  1. www.columbia.edu/cu/computin…

  2. www.columbia.edu/cu/computin…

  3. www.youtube.com/watch?v=Ynn…

  4. www.youtube.com/watch?v=RPO…

  5. www.quadibloc.com/comp/cardin…


更多内容,请关注公众号:dingtingli

WWH 系列文章列表:

[1] Why - 为什么 JS 更像一门编译型语言?

[2] What - 什么是依赖注入?

[3] What - 如何清晰地理解算法复杂度 Big O?

[4] How - 不同的语言都如何处理错误?

[5] How - 面向对象语言如何处理异常?

[6] Why - 为什么排序算法复杂度上限是 O(NlogN)?

最近文章列表:

[1] 成就卓越:事业成功的核心要素

[2] C++异常处理的底层机制

[3] .git 目录里到底包含了什么?

[4] 看图聊算法:一个游戏让你理解二分法的本质

[5] 看图聊算法:还是一个游戏,让你理解三分法的本质

[6] 看图聊算法:为什么插入排序效率不高,却是使用频率最高的排序算法

[7] 看图聊算法:归并排序一个被教科书嫌弃的算法,我们为什么还要学

[8] 看图聊算法:冯·诺依曼的第一个计算机程序是怎么做出来的?

[9] 看图聊算法:快速排序为什么快?

[10] 不刷题,不面试,来看看算法学习在编程世界中的真正价值

[11] 看图聊算法:堆排序,我们学习它可能并不是为了排序