《程式設計珠璣(第2版 修訂版)》 第2章2 4節排序

2021-09-23 16:54:06 字數 1013 閱讀 4283

2.4 排序

現在我們來討論問題c。給定一本英語單詞字典(每個輸入行是乙個由小寫字母組成的單詞),要求找出所有的變位詞分類。研究這個問題可以舉出許多理由。首先是技術上的:獲得這個問題的解決方案需要既具有正確的視角又能使用正確的工具。第二個理由更具有說服力:你總不想成為聚會中唯一乙個不知道「deposit」、「dopiest」、「posited」和「topside」是變位詞的人吧?如果這些理由還嫌不夠,可以看一下習題6描述的現實系統中的乙個相似的問題。

解決這個問題的許多方法都出奇地低效和複雜。任何一種考慮單詞中所有字母的排列的方法都注定了要失敗。單詞「cholecystoduodenostomy」(我的字典中單詞「duodenocholecystostomy」的乙個變位詞)有22!種排列,少量的乘法運算表明22! ≈ 1.1241021。即使假設以閃電一樣的速度每百億分之一秒執行一種排列,這也要消耗1.1109 秒。經驗法則「π秒就是乙個納世紀」(見7.1節)指出1.1×109是數十年。而比較所有單詞對的任何方法在我的機器上執行至少要花費一整夜的時間——在我使用的字典裡有大約230 000個單詞,而即使是乙個簡單的變位詞比較也將花費至少1 微秒的時間,因此,總時間估算起來就是

230 000單詞×230 000比較/單詞×1微秒/比較=52 900×106微秒=52 900秒≈14.7小時

你能夠找到同時避免上述缺陷的方法嗎?

我們獲得的啊哈!靈機一動就是標識字典中的每乙個詞,使得在相同變位詞類中的單詞具有相同的標識。然後,將所有具有相同標識的單詞集中在一起。這將原始的變位詞問題簡化為兩個子問題:選擇標識和集中具有相同標識的單詞。在進一步閱讀之前,先好好想想這些問題。

對第乙個問題,我們可以使用基於排序的標識⑦:將單詞中的字母按照字母表順序排列。「deposit」的標識就是「deiopst」,這也是「dopiest」和其他任何在該類中的單詞的標識。要解決第二個問題,我們將所有的單詞按照其標識的順序排序。我所知道的關於該演算法的最好描述就是tom cargill的翻手表示:先用一種方式排序(水平翻手),再用另一種方式排序(垂直翻手)。2.8節描述了該演算法的乙個實現。

程式設計珠璣 續(程式設計珠璣 修訂版)

經久不衰的電腦科學名著 集深邃思想 實戰技術與趣味軼事於一冊 領略電腦科學之美 程式設計珠璣 續 作譯者介紹 譯者 錢麗豔 劉田叢書名 圖靈程式設計叢書 出版社 人民郵電出版社 isbn 9787115251510出版日期 2011 年5月 程式設計珠璣 續 是電腦科學方面的經典名著 程式設計珠璣 ...

《VoIP技術構架 第2版 修訂版)》一導讀

voip技術構架 第2版 修訂版 本書第1版完成於1999年,在其中,我們描述了乙個發生在 新世界服務提供商 new world service provider 與已有的 整體式提供商和集團 monolithic provider and corporation 之間的爭鬥。現在,我們都已知道這個...

《SAP入門經典(第4版 修訂版)》 導讀

為了達到簡明易懂的目的,我對內容的結構重新進行了安排,劃分成了5個部分。第一部分從介紹各種基本概念開始本書,第二部分覆蓋了sap的商業應用和元件。之後,順理成章地先讓我們從企業使用者的角度了解sap 第三部分 然後從it專業人員的角度深入分析 第四部分 為了介紹最近5年出現的新知識和新焦點,以及回應...