《编程原来是这么回事》算法篇(上)

1. 什么是算法?

你今天刷牙了吗?回想一下你是怎么刷牙的?

《编程原来是这么回事》算法篇(上)_第1张图片
image

是不是先拿出口杯牙刷和牙膏,往牙刷上抹牙膏,再放到嘴里刷刷刷,然后把牙刷和口杯洗干净,再把口杯牙刷和牙膏收起来……你说什么,我漏了一步?是什么呀?

噢,原来我忘记 漱口 了,真是个马大哈。这样吧,我把刷牙的每一个步骤列成一个清单,你再检查检查:

  1. 拿出口杯、牙刷和牙膏
  1. 把牙刷放到嘴里刷刷刷
  1. 往牙刷上抹牙膏
  1. 漱口
  1. 把牙刷和口杯洗干净
  1. 把口杯、牙刷和牙膏收起来
  1. 唱一首歌

你说什么,还有问题?在哪里?

噢,我应该先 往牙刷上抹牙膏 ,再 把牙刷放到嘴里刷刷刷;还有 唱歌 跟刷牙一点关系也没有,不应该放到这个清单里来。那现在这样对了吗?

《编程原来是这么回事》算法篇(上)_第2张图片
image
  1. 拿出口杯、牙刷和牙膏
  1. 往牙刷上抹牙膏
  1. 把牙刷放到嘴里刷刷刷
  1. 漱口
  1. 把牙刷和口杯洗干净
  1. 把口杯、牙刷和牙膏收起来

可能你觉得还是和你自己刷牙的流程不一样,这很正常。因为每个人刷牙都有一套自己习惯的流程,有一些细节上的变化,比如有人不喜欢用口杯直接用手接水,有人用的是电动牙刷需要按开关……但大致上的步骤应该是差不多的。

用同样的方法,我们可以给生活中很多事情都列出清单来,比如洗澡、穿衣服……只要你做这件事很熟练,那么仔细回想一下应该不难做到。

对于你刚刚完成的这张清单,我们有个听上去有点怪的称呼:算法

《编程原来是这么回事》算法篇(上)_第3张图片
image

算法(Algorithm) :做一件事的完整流程

算法就是做一件事的完整流程,也就是为了做成这件事,都需要哪些步骤,先做什么,后做什么。如果你能做某件事,就说明你已经知道了做这件事的算法。相反,如果你不知道做一件事的算法,那你基本上就不太可能把这件事做成。

举个例子,如果你从来没有学过魔方的解法,那么仅靠自己研究想把它复原是非常非常难的。如果你身边的一个朋友会还原魔方,就能说明他比你聪明吗?No!只不过他知道 “还原魔方” 的算法,而你还不知道而已。

《编程原来是这么回事》算法篇(上)_第4张图片
image

明白了这个道理,很多令人无法理解的事情,比如吞火表演以及各种魔术,就不再那么神秘莫测了。每一个魔术都有对应的算法,只是我们不知道而已。只要拿到了算法,我们就能明白到底是怎么回事,也就不会再觉得神奇了。

「试一试」 找一件日常生活中的事(比如:洗脸),跟你的家人或朋友交流一下,看看你们的算法有什么区别?哪些步骤他有而你没有,哪些你有而他没有?哪些步骤你们两都有但次序不同?

2. 我们能对算法做些什么?

想象一下,如果你拿到了一个需要组装很多零件的新玩具,是不是要把说明书放在身边或者拿在手上,一边看一边装?

《编程原来是这么回事》算法篇(上)_第5张图片
image

说明书上记录的就是 组装玩具 的算法,只要我们严格按照这个算法一步一步来,不出任何差错的话,就能把它组装好。这个按照算法来做事情的过程,我们管它叫做 执行

执行(Run):逐条去做算法中列出的步骤

要知道,组装玩具的算法可不是凭空出现在说明书上的,而是设计玩具的工程师想出来的。最初,它只出现在工程师的大脑里。工程师把它记录了下来,然后给它配上图、排版、印刷出来,最终才能以说明书的形态出现在我们眼前。

算法必须以某种形式记录和保存下来,否则我们就无法看到并使用它了。对组装玩具的算法来说,说明书就是保存它的 媒介。我们通过阅读说明书,得到了组装玩具的算法,才能把玩具装起来。

媒介(Media):记录和保存算法的物体或介质

如果你把这个玩具拆装过很多次,所有步骤都已经烂熟于胸的话,就算没有说明书,也能把它组装起来。这时,保存算法的媒介就是你的大脑。也就是说,你把这个算法 复制 到了你的大脑里。

复制(Copy):把算法保存到一个新的媒介上

当然,我们还可以用各种方式复制到其他的媒介上(比如:纸、照片、手机、电脑……),并传播给更多的人。借助现在发达的信息与互连网技术,算法可以自由穿梭在不同的媒介之间,一旦被创造出来,就很难彻底消失。

《编程原来是这么回事》算法篇(上)_第6张图片
image

假如你一个朋友也有同样的玩具,但是他的说明书不小心弄丢了,也没能记住组装的算法,结果玩具就装不起来了。有什么办法可以让他重新拥有组装玩具的算法呢?我相信你肯定能想到一大堆办法,比如:

  1. 把自己的说明书直接送给他 —— 转移已经存有算法的媒介

  2. 把说明书拍照或者复印一份发给他 —— 把算法复制到新的媒介上

  3. 给他打电话,把说明书念给他听 —— 通过声音传递算法

  4. 亲自动手给他示范怎么组装 —— 通过动作传递算法
    ……

最后,除了 执行 和 复制 以外,我们还可以对算法进行 修改,来适应需求和环境的变化。比如我们可以在这个玩具上加装别的零件,或者减少一些原有的零件,又或者把一个零件安装到别的位置上,结果就会拼出了一个和说明书上不一样的新玩具来。

修改(Modify) 添加、删除或变更算法中的某些步骤

如果修改后的算法执行更高效或者效果更好,那么复制传播它的人就会不断增多,最终新的算法可能会彻底取代原来的算法。相反,如果修改后的算法还不如原来的好,那么愿意复制传播它的人就会越来越少,最终会被逐渐淘汰并遗忘,消失在我们的视野中。要是改造后的算法和原来的算法效果差不多,那么就会作为一个变种,和原算法一直并存下去。

优胜劣汰,适者生存。每一个算法诞生之后,都在不断地复制繁殖,也在不断地进化,只有效果最好的算法才能传承下来。热门对战游戏里流行的那些“xx流”、“xx出装”,都是在不断进化中的算法,不是吗?

「试一试」 挑一件你已经做得很熟练的事(比如:打通某个游戏关卡),把算法里的每个步骤都写在纸上,然后找你的家人或朋友来执行你的算法。他能理解你写的算法吗?他能顺利地执行算法吗?他都遇到了哪些问题?你是怎么解决的?

3. 没有算法该怎么办?

俗话说“技多不压身”,也就是说我们掌握的算法应该越多越好,说不定什么时候就能用得上呢。然而,真正重要的不是你掌握了多少算法,而是在没有算法时知道该怎么去找。 只要这件事有人曾经做过,那就肯定有算法存在。如果我们知道怎么找到算法,就不会惧怕全新的挑战了。

想象一下,如果现在给你安排一个新任务,是你完全没有头绪的那种,比如:做一盘可乐鸡翅。因为你从来没有做过,所以脑子里没有对应的算法,当然也就没办法执行了。怎么才能完成这个任务呢?

如果你天性喜欢折腾和挑战,你可能会凭着自己的直觉,先动手试试看,但绝大多数情况下你会失败。因为正确的算法一般有好多步,要是你每一步都能靠运气蒙对,那就可以去买彩票了。

事实上,不管你想做什么事情,都可以通过下面这几个步骤来完成:

  1. 寻找算法:通过各种渠道找到可供采用的算法,越多越好

  2. 选择算法:在找到的算法中,选择最适合自己的那个算法

  3. 事前准备:满足执行算法所需要的各种条件

  4. 执行算法:逐步执行算法

请牢牢记住上面这几个步骤,它们非常非常重要!!我们可以称之为 元算法 ,也就是“算法的算法”。

首先,让我们来执行第一步:寻找算法。大概有以下几种方法:

  1. 通过搜索引擎进行查找

  2. 请教这个领域里的专业人士

  3. 查阅专业书籍

  4. 自己摸索尝试

要说哪种方法最方便快捷,那肯定是在手机或电脑上通过 搜索引擎 来查找了:

《编程原来是这么回事》算法篇(上)_第7张图片
image

搜索引擎(Search Engine) 提供信息搜索服务的平台

只要不涉及国家机密和商业利益,绝大多数的算法都可以通过搜索引擎找到。 当然如果你身边就有做菜的高手(比如:你亲爱的老妈),你也可以直接去请教她,她应该会很乐意告诉你算法的。不过要记住,她提供的算法未必是最好的,也未必是最适合你的噢!

在使用搜索引擎时,我们需要在搜索框里输入一些文字,比如 “可乐鸡翅” ,这些文字叫做 关键词。搜索引擎正是通过你提供的关键词,从无穷无尽的信息汪洋中,把你需要的内容筛选出来的。

《编程原来是这么回事》算法篇(上)_第8张图片
image

关键词(Keyword) 内容中具有识别性的词语

搜索引擎会为每一个关键词设立一个信息仓库,把所有包含这些关键词的信息都保存在里面,并按照某种规则进行排序。在数之不尽的仓库中,就有一个仓库的名字叫做 “可乐鸡翅” ,里面存放的都是和可乐鸡翅相关的内容。当你搜索 “可乐鸡翅” 时,搜索引擎就会打开对应仓库,把已经排好顺序的内容一页一页地显示出来。当然,还不会忘记加上一些收费广告。

搜索引擎会日以继夜地扫描互联网上新发布的所有内容,只要发现一篇文章里提到了 “可乐鸡翅” 时,就会把它丢进这个仓库里。然而,搜索引擎可不会区分这篇文章到底是在说怎么做可乐鸡翅,还是评价可乐鸡翅好不好吃,又或者是在讲述可乐鸡翅的由来。

当你发现在通过搜索引擎找到的内容里,有很多并不是我们想要的算法的时候,可以尝试一下 用多个关键词进行组合搜索。比如在搜索时加上 “教程”、“攻略”、“入门” 之类的关键词,找到算法的可能性就会大大提升。

「试一试」 挑一件你从来没做过的事,然后通过搜索引擎来寻找算法。多试验一些关键词,看看什么样的组合找到的有效算法更多,无用信息更少?

(未完待续)

你可能感兴趣的:(《编程原来是这么回事》算法篇(上))