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

1. 什么是算法?

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

image

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

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

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

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

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

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

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

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

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

image

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

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

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

image

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

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

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

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

image

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

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

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

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

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

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

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

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

image

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

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

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

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

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

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

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

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

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

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

3. 没有算法该怎么办?

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

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

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

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

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

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

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

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

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

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

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

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

  3. 查阅专业书籍

  4. 自己摸索尝试

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

image

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

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

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

image

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

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

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

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

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

(未完待续)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • Solr&ElasticSearch原理及应用 一、综述 搜索 http://baike.baidu.com/it...
    楼外楼V阅读 7,262评论 1 17
  • 周围的人曾无数次提醒我,你三十岁了。三十岁的女人怎么了,三十岁就该找个人人结婚,就该受到歧视吗?我每天对着镜子问自...
    小蜗牛回家阅读 321评论 0 0
  • 小白兔有個同事,叫变色龙。 变色龙名义上是team leader,负责某一個小团队的人与工作安排。小白兔因爲某些事...
    Candy的瑣事阅读 263评论 0 1
  • 全局注册 局部注册 使用 注意 必须使用v-if显示隐藏 必须使用 input 标签参考
    ArcherWong阅读 2,856评论 0 0