《演算法技術手冊》一1 1 理解問題

2021-09-23 05:09:00 字數 973 閱讀 1215

用演算法的眼光去看問題

演算法真的是非常重要!演算法的選擇會對軟體的效能產生巨大影響。本書將指導你學習一系列的演算法,例如搜尋和排序,還會介紹一些演算法經常採用的策略,例如分治或貪心。希望從此之後,你能夠靈活運用這些演算法來改善軟體的效能。

自「計算」出現之後,資料結構便一直與演算法緊密相關。本書將介紹一些基本的資料結構,並展示如何使用這些資料結構來高效地處理資料。

「在選擇演算法時,你需要做什麼?」我們將在接下來的章節中**這個問題的答案。

1.1 理解問題

設計演算法的第一步就是理解將要解決的問題。以乙個計算幾何領域的簡單問題為例:給定乙個二維點集p(見圖1-1),想象著用乙個橡皮圈把這些點圍起來,鬆開之後,這個橡皮圈的形狀就是凸包(能夠把點集p所有的點全部包圍起來的最小凸形)。那麼,現在的任務就是編寫乙個演算法,針對乙個給定的二維點集,計算它的凸包。

仔細觀察點集p的凸包就會發現,連線p中任何兩點的線段都位於這個凸包內。假設,我們把凸包中的點按順時針排好,不難發現,這個凸包其實是由h個順時針排列的點l0, l1, ..., lh-1組成,如圖1-2所示。每三個相鄰的點li, li+1, li+2組成乙個向右拐的線條。

有了這樣的資訊,也許你可以手工畫出任意點集的凸包,但是否能寫出乙個演算法呢(給出一系列循序漸進的指令,並且能夠高效地計算出任意點集的凸包)?

有趣之處在於,這個凸包問題貌似並不屬於任何眾所周知的演算法範疇。而且,似乎也並沒有任何線性時間的排序演算法能夠按照從左到右順時針對點進行排序。與此類似,要找到凸包上的一條線段並不難,因為這條線段一定會使得平面上剩餘的n-2個點都位於其「右側」,但也沒有顯而易見的搜尋演算法可用。

圖1-1:平面上由15個點組成的示例點集

圖1-2:圖1-1中點的凸包

《演算法技術手冊》一導讀

1.1 理解問題 1.2 簡單解法 1.3 高明做法 1.3.1 貪心演算法 1.3.2 分治演算法 1.3.3 並行演算法 1.3.4 近似演算法 1.3.5 融會貫通 1.4 總結 1.5 參考文獻 第2章 演算法的數學原理 2.1 問題樣本的規模 2.2 函式的增長率 2.3 最好 最壞和平均...

《演算法技術手冊》一2 1 問題樣本的規模

2.1 問題樣本的規模 問題樣本是解決問題的程式所使用的特定輸入資料集。在大部分問題中,隨著這一資料集規模的增長,程式的執行時間也在不斷增加。同時,過度地對樣本資料進行編碼 可能使用了壓縮技術 可能會不必要地降低程式的執行效率。尋找一種最優的樣本編碼方式是極其困難的,因為問題發生在複雜的現實世界,而...

《演算法技術手冊》一1 3 1 貪心演算法

1.3.1 貪心演算法 以下的貪心演算法展示了如何找到凸包上的每個點 刪除p中的最低點low low必須在凸包上。垂直畫一條穿過點low的直線,將剩餘的n 1個點分別和點low連線,以垂直直線右側的點的夾角為正值降序排列,夾角的範圍是從90皛 90啊 n 2是最右側的點,而p0是最左側的點。圖1 3...