| 2020-07-24
阅读893
到杂货店採买

伊恩・帕托斯是一位居住在伦敦东部的语言学退休教授。他在几年前不小心摔倒导致背部患有隐疾,再加上他害怕邻居养的那条狗,因此非常不喜欢出门。唉,可是为了温饱肚子,他得时不时就外出採买食物。伦敦是这样一座经常下雨的城市,伊恩有千万个不想出门的理由,现在又增添了一项不喜欢被雨水溅湿。他究竟该怎幺做,才能在不至于饿肚子的前提下,缩减在一星期内外出採买的次数呢?

在英国双人喜剧拍档「两个罗尼」(The Two Ronnies)所主演的长青幽默短剧中,有一经典桥段[1]是描绘一位顾客走进了一间五金行,接着向店老闆唸出手中购物清单的品项。然而,老闆并没有等客人先把清单上的所有项目一次唸完,而是对方指名一样物品,就随即动身去拿取,结果把自己搞得团团转。

请先记住这一桥段,我们稍后会再讨论。先让我们回过头,想想情境里的主人公伊恩可以如何决定自己要前往杂货店採买的频率次数。

以下是我们已见过数次的两种方法比较图。

用演算法找出人生最佳解:多久该动身前往杂货店採买一趟?

对于这一情境任务的解说,基本上就是「避免做重複的事务」。同理可证的情况还有像是:被交代要在十份不同文件上打孔的秘书,会选择把所有文件先收拢整齐,然后一口气打孔完毕,而不会一次只做一份。或是你在洗碗时,会先用洗碗精刷洗所有的髒碗盘,然后再以清水洗净,而不会每刷洗一个碗盘就紧接着用水沖洗。或是你要将洋葱切丁的时候,会先纵向切完再横向切。又或者是在新式高楼建筑里的电梯,会装设所谓的「目的层控制系统」,把要前往相同楼层的乘客聚集在同一部电梯里。除此之外,你还可以从另一个更细微的观察角度来看伊恩的故事情境,那就是诱发他动身前往杂货店的主要因素为何?稍后我们会针对这一问题仔细探讨。

在电脑运算中,资料集合的储存方式有许多种。我们在不久前认识了最基本的一种,也就是一排未配对成功的袜子阵列(array)。接着在第二章场景里,我们了解到阵列资料藉由分类排序,就能大幅提升搜寻能力。不妨回想衣架上按照尺码排列的那一排衣服,这就是这些被称作资料结构(data structures)或抽象资料型态(abstract data types)所发挥的基本功用。它将我们重视的一项或多项特性极大化,且通常会因此捨弃掉我们不那幺在乎的特性。从更广泛的层面来说,某些特性就是无法相容并存。例如,安全性和易用性(usability)──某个应用软体会在你每次点击按钮时,都要求你输入密码,这的确具有较高的安全性,但易用性也相对降低了。

接下来要介绍一个与本章情境切合,称作堆叠(stack)的资料结构。正如其名称所隐含的意义,「堆叠」将我们只在乎最上方资料的特性极大化,而不去管下方有多少项目。所以说,当你走进咖啡店看见一叠报纸时,你的视线大概只会扫过放在最上面的那一份,因为不须逐一翻找,你就知道摆在最上面的是当天的报纸,而你只是想看一眼今日头版标题是什幺。在堆叠的资料结构中也是如此,我们最想检视(peek)的是顶端的项目[3]。

就伊恩的情况而言,他的认知堆叠是由吃光的食物品项所组成。每当他把Kit Kat巧克力推入(push)到堆叠的顶端时,他就会一心挂记着要前往商店把堆叠的品项取出(pop),亦即反覆移除放在最上面的项目,直到堆叠空无一物为止。换言之,Kit Kat巧克力是清空堆叠的主要诱因。在Kit Kat巧克力被放进堆叠之前,他可以安然将其他吃光的食物品项暂时埋藏在堆叠里,毫无挂念地继续生活。

反观「两个罗尼」的短剧情境也存在相同的道理,如果五金行老闆可以针对各排货架建立出认知堆叠,他就不必反覆在梯子间爬上爬下,搞得自己折腾不已。客人会一口气唸完整份清单的品项,而老闆只须依循堆叠行动,即在绕经各排货架的过程中,依次在每一排货架的堆叠结构里取出客人需要的物品。

艾伦・图灵(Alan Turing)在一九四六年完成了一篇研究报告,以「埋藏」(burying)二字来介绍堆叠概念。诚如安德鲁・霍奇斯(Andrew Hodges)撰写的《图灵传》所述,这一概念对数学家冯纽曼来说是前所未闻。以下是该研究报告的简短节录:

阅读这些文献,对于现今我们认为是直觉般的概念是如何从过去演进传承至今,总会令人油然升起谦卑之情。我们也从中了解到,那些概念唯有历经人们极力阐述说明后,才能渐渐奠定不辩自明的地位。关于描述此一感想的另类观点,不妨参考以詹姆斯・弗林(Jim Flynn)命名的「弗林效应」(Flynn effect),其认为人类变得愈来愈聪明,部分原因是人们的理解智能持续成熟发展且愈来愈複杂,是以新一代人类的大脑先天具备了比前人更优越的直觉能力。

无论如何,阅读古文本总是让人乐此不疲,因为我们能由此探看从古至今一路走来的进程。犹记我曾读过神学家伊拉斯谟(Desiderius Erasmus)于一五三〇年出版的《儿童良好教养手册》(Handbook on Good Manners for Children),书里教导人们的观念,诸如「千万不要让鼻孔流淌着两行鼻涕,那会让你看起来跟邋遢鬼没两样。苏格拉底就是因为这种坏习惯才惹人诟病。」就生活在二十一世纪的读者看来,这一教诲理所当然到让人啼笑皆非,但在那时的环境背景里却是新颖的观念。

艾伦・图灵谈到了副程式操作指令,不禁让我想起堆叠的资料结构还可以用在另一个现实情境上。假想邮差先生隔天早晨送信到伊恩的家,却始终不愿直视伊恩的双眸。一串泪珠从邮差先生的脸颊上滑落,他的双唇甚至还微微颤抖着。

「不好意思,请问我做了什幺事情让你不开心吗?」

「坦白说是的。嗯,没错。都是你害的。」邮差先生回答道。目光凝视着远方的地平线。

伊恩试图想起自己究竟在何处冒犯了邮差,其回想的方法就近似于从堆叠里取出资料。这里所指的堆叠,也就是他在脑中建立的「邮差先生」资料结构。这一举例之所以合适,是因为伊恩最后一次与邮差先生互动的过程,相较于他们倒数第二次的来往更有可能是引发邮差先生不悦的罪魁祸首,而倒数第二次的互动又比倒数第三次更有可能是问题的起因。

用演算法找出人生最佳解:多久该动身前往杂货店採买一趟?

日常生活里还有什幺事物也是以类似堆叠的方式运作呢?不妨看看网际网路的例子。每当你点击一个连结,便是将该网站放入到堆叠的顶端,而每当你回到上一个连结时,就是将那一网站从堆叠的顶端取出。你并不在意自己浏览的网站总数,只要可以顺利回到上一页,再从这一网站回到上上一个网站就好。

至于伊恩,我们希望他能利用自己的认知堆叠与邮差先生言归于好,也能更善于规划何时要前往杂货店採买。

注释

[1] 可至此连结观赏。我们提及的剧情连续片段约出现在影片的中段。

[2] 该名称也可改为其他的产品置入。

[3] 这一用语为堆叠运算中的实际名称。此外正如你猜想的,堆叠运算的执行效率为常数时间。

书籍介绍

本文摘录自《做决定不要靠运气:从出门购物到分类邮件,用演算法找出人生最佳解》,商周出版
*透过以上连结购书,《关键评论网》由此所得将全数捐赠儿福联盟。

作者:阿里・艾默沙维(Ali Almossawi)
译者:朱诗迪

要听什幺音乐?什幺时候该去採买?该怎幺快速的把书架分类好?你生活中的选择困难,就让演算法来为你解决!

要怎幺开车才能最快到达目的地?脸书的动态要怎幺写才能精简有力又能完整表达感受?家里的储备粮食要多久去採买一次才不会饿肚子?买了一堆书要怎幺样有条理的摆到书架上好上满?如果你在生活中常被「该怎幺做」的问题击倒,老是向掷骰子一样的凭运气做决定,事后才懊恼,这本书将是你最佳的生活良药!

在本书中,作者阿里・艾默沙维用了一个存在于我们生活之中,却常被我们忽略的强大工具──演算法,来为你一一搞定你的「选择困难」症候群。这种存在于电脑里的科学概念,能够快速且有效地将複杂状况釐清,让你一眼就能辨别解决问题的最佳途径,更能够训练你的思考能力,使你成为一个更灵活且具有突破性的创意思考者!

用演算法找出人生最佳解:多久该动身前往杂货店採买一趟?