讀古今文學網 > 算法神探:一部谷歌首席工程師寫的CS小說 > 7 調整算法,大膽逃離 >

7 調整算法,大膽逃離

頭頂的甲板傳來了沉重的腳步聲,Frank環顧四周思考著如何應對這一突發狀況,但貌似並沒有選擇的餘地,唯一的一道艙門通向的正是頭頂的甲板和從那走來的不速之客們。而他們所在的儲藏室現在幾乎空無一物——早在抵達Usb港口的時候,船員已經將貨物全都卸下了船。試圖藏在這裡簡直就如同站在角落裡說「你看不見我」一樣荒謬。

Frank一個接一個地排除掉了他們可能選擇的應對方案,包括那通常都不怎麼奏效的躺下裝死的伎倆。這時,他看見Notation拿出她的徽章,立正站定在原地。

「你在想什麼啊?」Frank噓聲道。

「我是一個正在執行偵查任務的警官。」Notation解釋道。

Frank難以置信地搖了搖頭。「這套『我是警察,停下別動』的伎倆在這種時候根本沒用。事實上,絕大多數時候它都沒用。我們正在一艘走私者的船上調查一起偷竊警局財產的案件。警局裡根本沒人知道你在這,不是嗎?我敢打賭,待會兒走過那扇門的人也知道這一點。」

Notation張開嘴,試圖去爭辯,但她最終閉上了嘴,將她的徽章放回了外套口袋中。這時,一群身形巨大、穿著出奇講究的惡棍從門外湧了進來。他們在儲藏室內散開,將Frank和Notation圍了起來。

「女士們先生們,」Frank說道,「我們已經完成了對這艘船的檢查。看起來你們並沒有攜帶任何腐壞的鰻魚。我們的工作是試圖保證這個王國食品供應的安全。謝謝你們的耐心和配合,我們這就離開。」

似乎是對Frank這番話的回應,兩個身形巨大的惡棍抓住了Frank的手臂。他們將Frank拎了起來,準備將他帶回甲板上面。多年來的經驗讓Frank對此已有準備:他發明了一種姿勢,可以讓自己在這種時刻盡可能舒適。但即便如此,他還是能感覺到自己的手臂在慢慢地青腫起來。

「喂!」Notation叫道。看來她也同樣被帶出了儲藏室。

走上甲板,看到陽光的一剎那Frank不由地眨了一下眼睛。那群惡棍將他帶到了甲板的中間,隨即把他丟到了木地板上。砰的一聲,Notation也被丟到了Frank的身邊。緊接著,那群惡棍再一次把他們圍了起來。

Frank一邊打量著抓他們的這群人,一邊慢慢將自己調整到了一個坐著的姿勢。惡棍們一動不動,隨著船身來回搖擺,他們似乎在等人,看來他們真正的領頭人還沒到。Frank抓住這個機會,轉向離他最近的一個惡棍。

「接下來你們想把我們怎麼樣?」Frank問道,「關起來?丟到船下面?交給雇你們老大的人?」

那個惡棍聳了聳肩說:「別看我,我只在這裡工作了15天。」

「新手啊!」Frank說道。

Vinettee集團對保密有著狂熱般的信仰,他們只會把行事計劃告訴隊裡資格最老的人。新來的人則需要一步步證明他們的忠誠,慢慢得到提拔。所以要想知道任何有用的信息,Frank首先得找出船上資格最老的人。

Frank慢慢開始有了主意。Vinettee集團的這群惡棍從來都是按照資歷高低的順序來站位的。這是因為在Vinettee集團的體制內,每個人都有一位資歷剛好在自己之上的人作為自己的導師——比如剛剛加入的新人的導師便會是原本隊內資歷最淺的人。而在這種集體行動的時候,大家都會站在自己的導師旁邊。

所以這一圈惡棍說到底只是一個被首尾相連的按資歷排列的有序數組。二分搜索法似乎可以派上用場,不過得做一點調整去適應這個新的數據結構:這群惡棍們站成了一個圓,而不是一條直線。不幸的是,Frank並不知道這個數組的起點和終點。然而很快他就想到了一個能快速找到資歷最深的惡棍的算法。有了這個算法,Frank便能減少所需要詢問的惡棍的數量,從而能盡可能地在自己被再次帶走之前得到想要的答案。

他轉向那位新人惡棍右邊的那位,問道:「你呢?你是這裡的老手了嗎?」

「19天。」她答道。

有了這個信息,Frank幾乎可以確定這群人是按資歷由淺到深沿著逆時針方向排列的了。但他並不能完全確定,因為或許「15天」和「19天」便是這群人中資歷最淺和最深的人了,雖然這種情況的可能性很小。Frank曾經有過草草率率便開始搜索的經歷,結果可想而知,並不理想。因此在他真正開始搜索之前,他需要再找一個數據點。他選了剩下的惡棍中正中間的那位。

「你呢?」他問了剛來15天的惡棍對面的那位女人。

「37天,」她回答道,「你關心這個幹什麼?」

有了這個信息,Frank得以證實了他之前的猜想——這群惡棍的確是按資歷由淺至深按逆時針順序排列的。因此,Frank可以不再考慮「15天」和「37天」之間的任何人了。資歷最深的惡棍如果不是「37天」的話,就一定在「37天」的逆時針方向,且在「15天」之前。

Frank努力抑制住內心的一股惱怒的衝動,他從來沒有和資歷這麼淺的一群惡棍打過交道,他甚至覺得自己被侮辱了。「這簡直是太尷尬了,」Frank對抓住他們的那群惡棍說道,「我們被一群新手抓住了。你們是什麼人,替補隊嗎?」

「你在幹什麼啊?」Notation悄悄對Frank說道。

「一個改良版的二分搜索。」Frank低聲回復道。

Notation歎了口氣說:「這個我知道。看起來你在試圖找出資歷最老的一位,你做的簡直再明顯不過了。但為什麼?你又怎麼知道他們是按資歷深淺順序站的?」

Frank無視了她,深吸了一口氣,緊接著重新開始專心搜索。他不知道在大老闆到來之前他還有多少時間。他選擇了還沒被排除的那群惡棍裡正中間的一位,問道:「你呢?」

「這是我在這干的第三天。」那個惡棍猶豫地說道。

「我的天!」Frank大聲嚷嚷道,「真的嗎?」

「第三天?你不用先經過訓練什麼的嗎?」Notation問道,聽起來她是發自內心地感到好奇。

看來資歷最老的人不可能是「15天」和「3天」之間的三個人中的任何一個。由此Frank再次縮小了他的搜索範圍。

Frank再一次將剩下可能是老手的那群惡棍分成了兩半。「你一定是相對來說的老手了吧?」Frank問中間的惡棍道。

「額……先生,這是我第一天在這干。」那個惡棍結結巴巴地說道。隨著大家的目光集中在那個惡棍身上,他開始緊張得大汗淋漓。

Frank低聲咒罵了一句。

「不要叫他『先生』,」「19天」吼道,「他是我們的犯人。」

現在Frank已經把搜索縮小到了一個很小的範圍。「我猜你也是第一天吧?」Frank對其中除了「37號」外的最後一個惡棍問道,毫不掩飾自己的鄙夷。

那個女惡棍笑道,「我已經在Vinettee集團幹了一個多月了,」她說,「42天,天天都在防止你們這群警察來多管閒事。」

找到了!「真的嗎?」Frank說道,「那你在這幹什麼呢?」

女惡棍皺了皺眉頭,「你什麼意思?」

「Vinettee集團一般都會把更重要的任務交給資格最老的親信。來護送一批走私的捲心菜?這難道不是浪費你的時間嗎?」他一邊對女惡棍說道,一邊努力地回憶著自己是否在任務日誌中看到過任何對於捲心菜的提及。無論如何,這樣說也不是毫無道理,因為所有的走私者在他們的走私生涯中或多或少都與捲心菜打過交道。最近由於捲心菜稅的提升,Usb港的黑市內捲心菜的交易量幾乎增長了一倍。

「捲心菜?」女惡棍不屑地笑道,「我來的第一天就幹過捲心菜的活了。我們現在的活比捲心菜重要多了。」

「哦?」Frank說道,「已經升級到走私胡蘿蔔了?」

女惡棍臉紅了。即便走私蔬菜能佔到一個走私者總利潤的八成以上,但它依舊是走私行業中不那麼光鮮的勾當。

「不,」她說道,「比走私胡蘿蔔要好上百倍。我們在做一份私人的合約。」

「哦?」Frank說道,「我聽說販賣胡蘿蔔是個挺好的勾當啊,聽說利潤挺豐厚的。」

「你就別操心了,」女惡棍沾沾自喜地說道,「聯盟給我們的回報挺豐厚的。它要我們……」

「Runtime先生,」一個熟悉的聲音傳了過來,「別再試圖從我的手下口中套信息了。從他們那裡套信息並不難,但你能知道的這個信息也沒什麼用。有價值的信息我當然不會告訴他們。」

Frank抬起頭,看到Rebecca Vinettee也站到了那群惡棍的圈中,他不禁感到一陣胃痛。

「話說回來,你是?」Rebecca Vinettee朝向Notation警官問道。

「這是食品安全局醃鰻魚部的Susan Pointer,」Frank說道,「我們在追查一批不合格的Usb港的銀尾魚。」

Rebecca Vinettee輕輕地噓了一聲。「哦,Runtime先生,我並不這麼認為。」她停頓了一下,仔細看著Notation,「如果我沒弄錯的話,這是剛剛加入警察局Elizabeth Notation警官。」

「我在執行一起官方的……」Notation開始說道。

「不,」Rebecca Vinettee打斷了她,「你沒有在執行任何公務,Notation警官。我知道目前所有正在被安排執行公務的警官,上到水生俠盜的案子,下至非法鼻涕蟲比賽的瑣事。得益於我的線人,我對這些東西清楚得很。而你並沒有被分配去執行任何公務,但你現在卻在私闖我的貨船,所以現在問題是,我該怎麼處置你呢?」

「難道你不想先問問我為什麼會在這嗎?」Frank說道。

「Runtime先生,」Rebecca Vinettee異常耐心地說道,「請你不要低估我。我知道你為什麼在這,你來之前我就知道了。我對整件事情的來龍去脈瞭如指掌。

「但話說回來,我該怎麼處置兩個多管閒事的警官呢——哦,不好意思,你已經不再是一個警官了,對吧,Frank?我應該這麼說:我該怎麼處置一個多管閒事的警官,和一個多管閒事又已經被解職的警官呢?」

Frank Vinettee握緊了拳頭。他回想起自己在警察隊伍裡工作的最後一個月,還有Rebecca被從監獄中放出來時對他的嘲笑,當時Frank按部就班的調查並沒能證明她有罪,所以警察局的長官不得已只能放了她。

「乾脆你就接著這樣自說自話,讓我們無聊死算了。」Frank說道,「不如你來跟我們說說那個聯盟吧?」

Rebecca Vinettee笑了,「別擔心,Runtime先生。我沒有準備久留你們來聽我在這無聊地自說自話。我之前早就想好如果你們再一次妨礙我的話該如何處置你們了。你們還真以為你們對怎樣結束自己的性命還有任何左右的餘地嗎?」

「結束?」Notation尖叫道。

Rebecca Vinettee對她的一圈親信點了點頭,他們隨即上前一步,像一群表演無中生有的魔術師一般從他們考究的西服口袋中拿出了各式各樣的武器。一個高個男人從他的領帶下面拿出了一根長近一米的狼牙棒,另一個則從袖口中掏出了一把大砍刀。

然而出乎所有人意料的是,一個大桶隨著一聲巨響落在了甲板上。大桶裂開,一堆醃鰻魚散落在了甲板上的木板上。

警用算法導論:改編你的二分搜索法

節選自Drecker教授講義

在你的職業生涯中,並不是遇到的所有問題都會有現成的答案。的確,學者們積年累月,研究了大量的各式各樣的問題,也想出了很多不同的解決辦法。但在辦案的時候你依然會遇到新的不同的問題。如果你上這門課僅僅是記住了一堆算法的話,你很快就會遇到很大的麻煩。

為了解決這些新問題,你必須理解每個算法背後的原理,從而知道如何去調整它,讓它能適用於一個新的問題。二分搜索法背後的基本思想——利用數據中的規律去不斷地將搜索的範圍減半——遠比二分搜索法具體的應用更重要。有了這個基本思想,你可以調整二分搜索法,讓它適用於環形的有序數組。你甚至可以用它去找出咖啡的最佳飲用溫度——只要不斷地根據每次咖啡的冷熱情況去嘗試不同的溫度,直到找到那個剛剛好的溫度就好了。