6 二分搜索寻线索(第2/3页)

“187页!”在Frank在脑海里计算出中间值之前,Notation便脱口而出。Frank翻到了第187页,发现这页也有文字记录,看来187页也不是最后一次航行记录,应该还在187~249页之间。于是他继续调整下界值为187。

“218页!”Notation说道。该页竟然还是空白页,那么最后一条记录必然在187~217页之间了,因此Frank将下界值和上界值分别改为187和217。

“202页!”在Frank将上下界值相加之前,还没来得及计算中间值,Notation又脱口而出。

“你为什么算得这么快?”Frank问道。

“熟能生巧呗。”她回答,“在学校里,每当课余休息时我们都会做二分搜索,我总是能赢。”

Frank摇摇头,咕哝道:“听起来挺好玩的。”

Frank翻到了第202页和203页,发现也都有笔记。“接下来是210页!”Notation说道。

在第210页,他们终于发现这是航行日志的最后一页,上面描述了的最后一次航行的详细记录。“接下来做什么?”Notation问道。

“我们要找到最后一次航行中可疑的包裹或者是港口。这页大约有70个记录,我们要一条一条地看。”

“穷举搜索?”Notation问道,“我们难道不能用一种更高效的方法吗?难道不能把这些记录按照装卸货和交付时间来排序吗?”

“这里不能使用排序。”Frank回答道,“我们不知道每条记录的时间。只有当使用了确定的维度将这些数据排序时,这些排好序的数据才有用。不能按照不确定的维度来进行排序。你想想是不是这样?”

“哦。这是‘天气记录’问题。”Notation说。

“什么问题?”Frank问道。

“这是一个在查找过程中以错误的方法对数据进行排序的例子。”Notation解释道,“Drecker教授给我们举了一个例子:如何在最近十年中找到最冷的一天。如果你将每天的气温日志按照日期时间来排序,你使用二分搜索可以很容易地知道一个指定日期的天气记录。但是这并不能帮助我们找出最冷的一天,所以我们仍然需要浏览每一天的气温记录。”

“我们还是回到现实吧!”Frank说道,“别说那些没有用的,此时你还是找出哪些记录对你有用,哪些对你没有用吧。不要担心,刚才的错误对一个新手来说是很常见的。”

Frank看到Notation对他的话大为恼怒,不禁窃喜,并竭力控制住自己的幸灾乐祸。每个新手在刚出校门时都认为自己无所不知,但是事实证明每个人都还有许多东西需要学习。这次幸好Notation并没有遇到太多麻烦。Frank之前曾经花费很长时间用铲子去铲成桶的猪粪,也正是那个时候,他了解到了二分搜索,那时他也对他的职业选择产生了质疑。

大约三分钟后,他们找出了唯一的线索。Retry Loop最近有两次可疑的停靠,Mudwall港口和Frayed Cable岛。即使是走私人员,停在这两个地方也非常奇怪。Mudwall港口依托一个偏远又满是泥浆的农场,还经常吹嘘其少之又少的贸易量。Frayed Cable岛更加荒凉:这是一座岩石小岛,岛上仅有一座建筑——现在已经废弃的IronRing监狱。

“这里,”Frank指着日志说道,“这就是他们拿走你文件的地方。Mudwall港口或Frayed Cable岛。他们可能在一个地方丢掉文件后在另外一个地方提取款项。”

“你怎么知道的?”Notation问道,她看起来很怀疑,“难道我们不应该考虑所有港口……”

Frank打断她的话:“我们没有时间找出所有港口。”他没有详细解释。他使用他自己发明的算法,即启发式搜索,虽然在当船长时这种算法曾让他陷入麻烦,但是他有一种直觉,并且他坚信这种直觉。