首页 » 算法神探:一部谷歌首席工程师写的CS小说 » 算法神探:一部谷歌首席工程师写的CS小说全文在线阅读

《算法神探:一部谷歌首席工程师写的CS小说》28 搜索难题

关灯直达底部

“你给我出去!”Loop教授又说了一遍。

“我是来谈公事的。”Frank回应道,并没有站起来。他能听到身后轻轻的脚步声,有人正拿着十字弓向他靠近。

“不太可能,”Loop教授说,“我认识Donovan警长很久了,他不是那种依靠私家侦探的人。在我印象中,他总喜欢选择直面新的挑战,并让好事之徒远离他的案件。”

Frank的手准备伸向口袋。

“别想轻举妄动!”他身后传来粗重的声音。

Frank心中的怒火开始燃烧,他最恨别人拿着十字弓在背后指着自己。“只是一张羊皮纸。”他咬牙切齿地说。

“那就慢慢拿,”那个粗重的声音说,“要是敢快了,我就射箭。”

Frank默默叹了口气。只有一种人会这样说话——Boolean家族。Boolean家族非黑即白的世界观使他们成为非常能干的警卫。你不可能通过说服Boolean家族中的任何一个人来让自己脱身。在Boolean人看来,要么你破坏了规则,要么没有破坏,没有其他可能。

Frank极其缓慢地取出警长的信,身体往前倾,花了整整一分钟才将信放到桌面上。他没有靠回去,此时的动作越少越好。

Loop教授研究了一会,向她的警卫点点头。Frank听到十字弓的保险扣上了。他松了口气,靠回椅背。Loop教授挥手示意警卫出去。

“你让Donovan警长给你写了一封介绍信?”Loop教授问道。

“如你所说,这是一个敏感话题。”Frank回答。

“你应该听说过我的声望吧。”Loop教授轻声笑道。

“我上过你的课。”Frank低声含糊地说,Loop教授没有听到。

“所以,你正在调查盗贼。你想知道什么?”

一瞬间,她的态度发生了180度转变。她的眼睛快速扫过Frank的脸,仿佛在分析每一个反应。所有幽默的语气全部不见了,只剩下公事公办的态度。Frank想知道她刚才愉快的闲谈中有多大成分是逢场作戏。巫术犯罪学是一个危险的领域,而Loop教授却一直能够幸存下来。

“警察局有哪些保护魔法?”Frank问道。

“基本的报警咒语,”Loop教授说,“这些咒语可以发现哪些人在警察局使用了魔法,但不能预防。”

“为什么不采用魔法屏障?”

“不切实际,”教授解释道,“警察局雇佣了太多的巫术顾问。他们需要给证据施加神圣咒语,给囚犯施加真理咒语,给档案施加魔法反射咒语,以及给午饭施加再加热咒语。”

Frank点点头,想起来一次有关魔法优先队列的谈话。

“无论如何,这太过于昂贵了,”Loop教授补充道,“只有皇家城堡和监狱配备了基本警报咒语之外的咒语。城堡拥有一大堆的保护咒语,但没有抑制咒语。Marcus为国王做了太多的事情。”

“所以说有人能够在城堡里使用魔法?”Frank想确认下。

“他们可以,”Loop教授回答,“但是这样做不太明智。城堡拥有十多个保护咒语,可以阻隔攻击性魔法。Fredrick国王也雇佣了六个巫术警卫。他们虽是新手,但也能解开基本的咒语,况且还有Marcus。很少有巫师想跟他交手。”

“使用魔法神器怎么样?”

“额,这是个好问题。这取决于魔法神器本身。当然,城堡拥有针对武器类神器的保护咒语,但是没有人可以抵抗所有神器,因为种类实在太多。鉴于多数神器无须新的魔法(之前已经被施魔法),监狱里的咒语阻隔的咒语甚至都起不了作用。”

“什么?”Frank问道,“我以为监狱不受任何魔法的影响。他们不是关押了邪恶巫师吗?而且Exponentious不是也被关押在里面吗?他曾经试过使用魔法毁灭整个王国。为什么他们不直接阻隔所有魔法神器?”

Loop教授干笑了两声:“要让你失望了,你无法阻隔所有神器。但也不用太担心,这些巫师对最强大的囚犯进行了很好的警卫。并且,所有的囚犯在抵达监狱时都要先进行彻底的搜身。”

“监狱还有哪些其他的保护措施?”Frank继续问,随着了解的越来越多,他开始变得害怕起来。

“我们来仔细看看,”Loop教授说,她开始在清单上用手指打钩,“石墙、护城河里布满暴躁的獾、100个警卫、重型橡树门、一些装饰性松木门、每条走廊里的轻度作呕咒语、困难搜索咒语,还有……”

“困难搜索咒语?”Frank打断道。

“这也不是什么新鲜事物了,”Loop教授解释道,“在施加咒语阻隔的咒语之前,他们在监狱里施加了大量的保护咒语。”

“那么困难搜索咒语是什么意思?”Frank继续问,一股恐惧感在心中升起。

“它让人很难找到某个囚犯的房间。更准确地说,它能够神奇地交换房间。如果你把这些房间想象成一个巨型的数组,困难搜索咒语即是一个交换数组下标的算法。它每天半夜都会对所有房间进行随机交换。

“这使得任何想要从监狱中救出罪犯的想法都很难实施。由于数组值之间没有结构,闯入者只能依靠穷举搜索。并且,因为房间每天重新打乱,你无法在几个晚上完成搜查。监狱警卫都抱怨这种随机性很讨人厌。他们每天需要花费几个小时才能完成点名。不过我听说他们最近想出了一个游戏叫作‘猜猜下一扇门后的会是谁?’,赌注最高已经达到每扇门一个元宝。”

“他们是否记录新房间的位置?”

“不,那样就毁了所有的目的了!如果他们制作一份所有囚犯所在房间的地图,类似于倒排索引,那么你就能找到囚犯了。如果你能闯进首都警察局的档案室偷走房间分配资料,那这个咒语还有什么用?这个咒语的目的就是让闯入者花费数个小时在监狱里寻找,而这显然无法实现。所有警卫都相互认识。”

Frank终于了解完所有情况了。警长曾说过,Unnecessary Complexity联盟是那个邪恶巫师Exponentious的追随者者或同谋,他是皇家监狱里最危险的犯人。每个人都在担心这个联盟正在策划再一次的反击,甚至可能袭击城堡。但是实际的策划简单很多。联盟正在策划劫狱,他们打算解救联盟领导。Frank从椅子上跳起来,幸好身后的十字弓箭手早就不在了,他冲向门口。

“谢了。”他回过头来说,开始下楼梯。

Frank找到Notation时,他上气不接下气,费了很大的劲才说出:“需要你的帮助……劫狱……今晚……巫师。”

Notation看了他足足五分钟,有些担忧,有些兴趣,但又有种被打扰到的气愤。“快说,Frank。”她最后终于说道。

Frank仍然弯着腰,双手撑在膝盖上,以一种警告的眼神看着她。

“你一路跑来找我,”她说道,“我刚才听到你喘着气说需要我的帮助。”

Frank无视了她的意见。“我想明白了,”他终于有气力讲话了。“巫师们准备今晚劫狱。”

Notation看起来很惊讶。“劫狱?Socks劫狱想干什么?”

“等等。你怎么知道是Socks?”Frank问道,有些出乎意料。

Notation很迷惑:“你什么意思?我以为你怀疑他一段时间了。不是吗?他一点也不狡猾。”

“是的。是有些蛛丝马迹。”Frank没有正面回应。

Notation沉默下来,盯着地面,她的大脑飞速运转着,试图将其余的事件联系起来。突然,她的表情变得灰暗了,又看回Frank。“为什么告诉我这些?”她问道,“我现在不管这个案子了,还记得吗?”

Frank盯着她,难以置信。“你怎么能让那种事阻拦你的脚步?”他问道,“难道你不想抓住这些盗贼吗?”

“我当然想,”Notation简短地回答,“但是警长说过……”

“忘记警长吧,”Frank打断了她的话,“这是你的案子,无论他说了什么都不重要,不是吗?”

Notation看起来有些矛盾,Frank抓住这个间隙。

“听着,”他补充道,“想要抓住这些贼,我需要帮助,这次我不能调集警察,至少现在还不行。我很确信其中一个恶棍正假扮一名警察,但是我不知道他是谁。在我搞清楚之前,我无法相信任何人。”

“那么为什么相信我?”Notation反问。

“因为你在这里。”Frank说。

“这不是一个好理由!”Notation说,显然被这句话的隐含意义冒犯了。

“不是那样,”Frank说,试图打消她的反对意见,“我的意思是,因为你在这家店里用你自己的资金购买定价过高的‘堆’。这说明你很关心自己的工作。更重要的是,如果你以某种方式参与到巫师的劫狱中,你将很容易让邪恶巫师联盟给你做一个魔法‘堆’。只要有更好的选择,任何心智正常的人都不会直接走到Orb区。”

Notation站在那儿,直视着Frank。

“是你让我来这里的。”她咬牙切齿地说道。

“这也是好事,”Frank说,“因为我可以准确地知道今天上午在哪里可以找到你。这是全世界最简单的搜索问题,如同在一个数组中去找一个已知下标的值一样简单。我只需要直接来到Heaperous的店。不过我的确是跑过来的,”他承认,“我想到你会来得早一些,我不想与你错过。”

Notation看起来还没有完全释怀:“你让我来这里是想验证我是否参与此次阴谋?”

“不,我让你来这里是不想让你参与其中,”Frank承认道,“我只在跑来途中想过证明这一点。我以为……”

“你不相信我?”Notation冷冷地问道,听起来每个字都像是在谴责Frank。

“不要认为这是针对你个人的,”Frank说,“我不相信任何人。”

“你……你……”Notation气急败坏地说,渐渐涨红了脸,显然无法说完对Frank的指责。

几分钟后,Frank说:“你要加入吗?”

她僵硬地点点头。

“好,”Frank说,“两个小时后在监狱门口见面,带上十字弓。”

Notation再次点了点头。

“还有一个碗。”Frank补充道。

“一个碗?”Notation问道,暂时从愤怒中走出来,很是惊讶。

Frank开口大笑:“监狱的走廊里有一些轻度作呕的咒语。你可能需要一个碗来呕吐。”

警用算法导论:期末考试复习课

节选自Drecker教授讲义

如果你从这门课中只学到了一样东西,那应该是:高效算法的关键在于信息。当遇到一个新的问题时,应该花些时间理解这个问题的结构和它的数据。问题拥有的结构越多,你越有可能使用这些信息。正如你所看到的,在一个有序数组中找到一个值比在一个完全随机的数组中找到一个值要简单得多。有时候,你甚至可以建立附属的数据结构,例如堆或逆向索引,以提供所需要的结构。尽管如此,解决问题的第一步始终应该是理解问题。