算法導論課後習題解答 第一部分 練習1.1-1->1.1-5

很高興能和你們一塊兒共同窗習算法導論這本書。筆者將在業餘時間把算法導論後面的題解以博文的形式展示出來但願能獲得你們的支持謝謝。若是有可能我會作一些教學視頻免費的供你們觀看。算法

練習題選自算法導論中文第三版第6頁中的練習。數據結構

1.1-1 給出現實生活中須要排序的一個例子或者現實生活中須要計算凸殼的一個例子。

這個問題有倆個子問題。我一一解答:學習

(1) 首先是排序,平常須要排序的地方不少,例現在日微博熱搜等等這個不用細說了。spa

(2)可是關於第二個問題我須要多寫一點。翻譯

第一這本書的翻譯的地方有誤,凸殼在這裏指的是計算幾何中的多邊形凸包問題。code

下面摘選自百度百科。視頻

⒈對於一個集合D,D中任意有限個點的凸組合的全體稱爲D的凸包。
⒉對於一個集合D,全部包含D的凸集之交稱爲D的凸包。
能夠證實,上述兩種定義是等價的
概念
示例圖(一)
示例圖(一)
1  點集Q的凸包(convex hull)是指一個最小凸多邊形,知足Q中的點或者在多邊形邊上或者在其內。右圖中由紅色線段表示的多邊形就是點集Q={p0,p1,...p12}的凸包。
2  一組平面上的點,求一個包含全部點的最小的凸多邊形,這就是凸包問題了。這能夠形象地想成這樣:在地上放置一些不可移動的木樁,用一根繩子把他們儘可能緊地圈起來,而且爲凸邊形,這就是凸包了。
數學定義:設S爲歐幾里得空間  的任意子集。包含S的最小凸集稱爲S的凸包,記做conv(S)

  

 凸包問題在實際中的應用很普遍,它能夠應用於冶金術、城市規劃、圖像處理、統計學等等多個領域。blog

1.1-2 除速度外,在真實環境中還可能使用哪些其餘有關效率的量度?

學太高中物理的都知道有功率吧。實際生產中還有開發效率,生產效率。排序

別的筆者暫時也想不出來。遞歸

1.1-3 選擇一種你之前已知的數據結構並討論其優點和侷限。

筆者在這裏列舉一個圖的數據結構-------鄰接矩陣。並以PAT練習平臺中的某一道題來舉例子。

首先介紹一下鄰接矩陣:(圖畫的不咋好請諒解)

在這裏 咱們徹底能夠用一個矩陣來將右邊的無向圖的節點和節點之間的關係完美的表現出來,可是當咱們的節點過多,而關係少的時候,這個鄰接矩陣就顯得過於臃腫了,因此咱們能夠總結出如下倆點:

1)鄰接矩陣的優點在於描述通俗易懂,算法實現起來簡單,在稠密矩陣中效率依然很高。

2)鄰接矩陣的侷限性在於在處理的節點過多的時候(即稀疏矩陣),不管是時間複雜度仍是空間複雜度均太高。

下面這道題是一道練手的簡單題,有興趣的朋友能夠去作一下來感覺一下鄰接矩陣和稀疏矩陣的不一樣。

 

題目連接:

這道題若是你認真的去作了,你就會發現。雖然鄰接矩陣不管是在算法實現上仍是結構都很簡單,可是不管如何也不能避免他在遍歷的時候的時間複雜度太高,(通常都是O^2級別)。

所以通常在處理稀疏矩陣的時候,咱們通常選擇鄰接表的實現方法去替代鄰接矩陣的實現方法。

 1.1-4 前面給出的最短路徑與旅行商問題有哪些類似之處又有哪些不一樣?

旅行商問題簡而言之就是選出全部可能的候選路徑,而非最短路徑。

它們是類似的,由於每一個人都必須走一個圖並在其中找到一條路徑。

他們又是不一樣的,最短路徑僅須要兩點之間的路徑,而旅行推銷員須要在返回第一點的更多點之間的路徑。

至於如何尋找最短路徑最簡單的方法就是進行BFS(寬度優先遍歷)。

下面是摘取百度百科的介紹

已知圖G=(V,E)和一個源頂點s,寬度優先搜索以一種系統的方式探尋G的邊,從而「發現」s所能到達的全部頂點,並計算s到全部這些頂點的距離(最少邊數),該算法同時能生成一棵根爲s且包括全部可達頂點的寬度優先樹。對從s可達的任意頂點v,寬度優先樹中從s到v的路徑對應於圖G中從s到v的最短路徑,即包含最小邊數的路徑。該算法對有向圖和無向圖一樣適用。
之因此稱之爲寬度優先算法,是由於算法自始至終一直經過已找到和未找到頂點之間的邊界向外擴展,就是說,算法首先搜索和s距離爲k的全部頂點,而後再去搜索和S距離爲k+l的其餘頂點。

通俗點說,就是在每一次遍歷的時候,將每一個子節點放入一個隊列中,而後再不斷遞歸以此尋找最短路徑。

對於最短路徑的尋找方法還有倆種最經典的。

1)Dijkstra(迪傑斯特拉)算法

他的算法思想是按路徑長度遞增的次序一步一步併入來求取,是貪心算法的一個應用,用來解決單源點到其他頂點的最短路徑問題。

算法思想

首先,咱們引入一個輔助向量D,它的每一個份量D[i]表示當前找到的從起始節點v到終點節點vi的最短路徑的長度。它的初始態爲:若從節點v到節點vi有弧,則D[i]爲弧上的權值,不然D[i]爲∞,顯然,長度爲D[j] = Min{D[i] | vi ∈V}的路徑就是從v出發最短的一條路徑,路徑爲(v, vi)。
那麼,下一條長度次短的最短路徑是哪一條呢?假設次短路徑的終點是vk,則可想而知,這條路徑或者是(v, vk)或者是(v, vj, vk)。它的長度或者是從v到vk的弧上的權值,或者是D[j]和從vj到vk的權值之和。

通常狀況下,假設S爲已知求得的最短路徑的終點集合,則可證實:一下條最短路徑(設其終點爲x)或者是弧(v, x)或者是中間只通過S中的頂點而最後到達頂點x的路徑。這可用反證法來證實,假設此路徑上有一個頂點不在S中,則說明存在一條終點不在S中而長度比此路徑短的路徑。可是這是不可能的。由於,咱們是按路徑常度的遞增次序來產生個最短路徑的,故長度比此路徑端的全部路徑均已產生,他們的終點一定在S集合中,即假設不成立。

所以下一條次短的最短路徑的長度是:D[j] = Min{D[i] | vi ∈ V - S},其中,D[i]或者是弧(v, vi)的權值,或者是D[k](vk ∈ S)和弧(vk, vi)上權值之和。

2)Floyd(弗洛伊德)算法

Floyd算法是一個經典的動態規劃算法。是解決任意兩點間的最短路徑(稱爲多源最短路徑問題)的一種算法,能夠正確處理有向圖或負權的最短路徑問題。(動態規劃算法是經過拆分問題規模,並定義問題狀態與狀態的關係,使得問題可以以遞推(分治)的方式去解決,最終合併各個拆分的小問題的解爲整個問題的解。)

算法思想

從任意節點i到任意節點j的最短路徑不外乎2種可能:1)直接從節點i到節點j,2)從節點i通過若干個節點k到節點j。因此,咱們假設arcs(i,j)爲節點i到節點j的最短路徑的距離,對於每個節點k,咱們檢查arcs(i,k) + arcs(k,j) < arcs(i,j)是否成立,若是成立,證實從節點i到節點k再到節點j的路徑比節點i直接到節點j的路徑短,咱們便設置arcs(i,j) = arcs(i,k) + arcs(k,j),這樣一來,當咱們遍歷完全部節點k,arcs(i,j)中記錄的即是節點i到節點j的最短路徑的距離。(因爲動態規劃算法在執行過程當中,須要保存大量的臨時狀態(即小問題的解),所以它天生適用於用矩陣來做爲其數據結構,所以在本算法中,咱們將不使用Guava-Graph結構,而採用鄰接矩陣來做爲本例的數據結構)

這倆種算法若是之後有機會,我會將具體實現介紹給你們。
 
 

1.1-5 提供一個現實生活的問題,其中只有最佳解才行。而後提供一個問題,其中近似最佳的一個解也足夠好。

這個。。。。呵呵呵呵
 
當你考研的時候,做爲理工科的你最佳選擇是去麻省理工大學繼續深造。
最後發現只要是個大學就行。
 
近似解。。呵呵呵
 
 

總結:這一篇的習題側重於對於算法的啓發,但願我能在空餘時間,將後面的各式各樣的練習題答案以博客的形式發表出來,並加上我本身的一些看法。

相關文章
相關標籤/搜索