什么是算法?想理解什么是算法,我们要先设想一个场景 。几千年前,一位祖先凭着他对已故祖母如何做面包的记忆,尝试自己做面包 。但是,他真的不知道该怎么做 。他犹豫着,一开始先将麦仁放入沸水中,然后对自己说,这也许是个糟糕的想法 。这位祖先的困境,正是我们都会面临的情况——遇到某一个问题,却又不知道该如何解决 。我们想着解决方法,去尝试,反复探索实验,顺便有了一点点意外发现,直至成功……或者失败 。
然而,真正的面包师并不是这样做的 。他们不会给每炉面包都重制一个烘焙食谱,因为他们已经掌握并牢记了面包的烘焙方法 。多亏了面包食谱,面包师可以每天给我们提供面包 。事实上,人类文明的发展不仅源于有些人的发明创造,也因为另有人“复制”了这些发明,才使其得以改进 。但是,我们忘却了面包食谱的宝贵之处 。首先,食谱降低了不确定性:多亏了它,面包师知道,除非突遭一场灾难,否则面包将会在晚餐时准备好 。有了这个食谱,不需要什么想象力或是天赋,任何人都可以做面包 。就拿两位作者来说,我们对面包烘焙没有任何天赋,但仍可以从网页上找到恰巴提的食谱,运用适当的和面力度,借助更富有想象力和才华的面包师们写下的方法,做出面包 。最终,这个食谱成为了人类遗产中的一部分,在几千年的历史长河中,代代相传 。
食谱就是一个算法,我们就此有了“算法”概念的初步定义:一个算法是解决一个问题的进程 。我们并不需要每次都发明一个解决方案 。
文章插图
甜番茄 - 黑豆卷食谱
从这个定义不难看出,自人类历史初期,我们就一直在发明、使用和传播着各种各样的“算法”,用来烹饪、雕琢石器、钓鱼、种植扁豆及小麦,等等 。
进程和符号有些算法与面包食谱不同,它们能解决书写符号的问题,例如数字、字母等 。算法汇集在一起,形成蕴含不同含义的数目、词语、句子及文本 。
例如,二分查找算法的用途是在字典中搜索某个特定词 。二分查找法从字典中间开始查找,对比目标词与中间词的位置,根据目标词位于中间词的前或后,来选择字典的前半部分或后半部分作为新字典,然后再用二分查找法继续查找,以此类推,直到找到目标词为止 。这一算法解决涉及一种书写符号——字母的问题 。还有一些算法可以实现加法、减法等,解决涉及另一种书写符号——数字的问题 。这类算法被称为“符号算法” 。
计算机科学家往往将“算法”一词的含义限定为此类“符号算法” 。考虑到这种限制,自然,我们就不能将算法的历史追溯到文字发明之前了 。然而,广义上的算法概念其实与文字同样古老 。从迄今人类所发现的最古老的书面踪迹表明,古代书吏已经开始使用算法了,例如用于记账的加法和乘法 。文字可能就是因此而发明的 。
算法和数学数学家们从很早便开始关注算法的设计了 。比如,大约公元前300 年的欧几里得算法可以计算两个整数的最大公约数 。我们简单说明一下 。读者若是在攀登数学高峰时感到吃力,大可以直接跳过这一段,或把以下内容当作一首深奥的诗,尽量去理解 。
一般来说,一个算法会在输入端接收数据,这些数据构成了算法的参数 。在欧几里得算法中,输入数据就是两个不为零的整数,设为 a 和 b,且 a 大于 b,例如 a 等于 471,b 等于 90 。通常,算法会在输出端返回另一些数据 。在欧几里得算法中,输出数据是一个整数,即a 和b 的最大公约数 。
将欧几里得算法应用在整数 471 和 90 上,即有:
- 用 90 和 21 替代 471 和 90,
- 然后用 21 和 6 替代,
- 接着用 6 和 3 替代,
- 再用 3 替代,这时 3 即为所求 。
算法也是中世纪西方数学家所关注的核心问题 。数学家们引进了印度- 阿拉伯数字,以及与这种数字系统配套的算法 。其中一本著作是通晓阿拉伯语的波斯数学家穆罕默德?穆萨?花拉子米在 9 世纪撰写的《印度计算法》(Algoritmi de numero indorum)一书 。“花拉子米”(al-Khuwārizmī)一名源自作者的出生地花剌子模地区,今属乌兹别克斯坦 。有文献证明,自1230 年起,花拉子米这个名字就成了“算法”(algorithm)一词的来源 。
- 牛顿运动三大定律背后那些传说和伟大人物|伟大的数学公式巡礼
- 计算进化史:改变数学的命运|古老的起源
- 跨越三个半世纪的智力探险:费马大定理
- 「不可能的数字:复数」-图解数学
- 你不知道的祖冲之-科学史沙龙
- 自然常数 e 的故事
- 灵签占卜:四个阳台选一个,测你50岁之后的福气有多少!
- 熬到明天,祥云天上绕,财运大发,苦日子不见的3大属相
- 灵签占卜:睡午觉,哪一个地方最合适?测你的苦日子啥时候到头
- 灵签占卜:选一条你最爱的裙子,测你“哪个优点”最吸引异性?