1. 程式人生 > >“小筆記系列”之《演算法導論》----最近一次修改於2019/1/9,更新到第六章。文章主要記錄我看這本書的感受,我每看完一章就在這篇文章的基礎上修改一下。

“小筆記系列”之《演算法導論》----最近一次修改於2019/1/9,更新到第六章。文章主要記錄我看這本書的感受,我每看完一章就在這篇文章的基礎上修改一下。

本人大四上即將結束,於2018年12月18日購《演算法導論》這本書,慢慢看,第一階段先主要理解各個章節說的演算法都是什麼意思,書上的課後習題先不做,用得上什麼演算法我再詳細學習。這是官方課後答案的連結

 放在開頭:沒有好的演算法,壞的演算法之說,重點是針對不同的情況,針對不同的資料,針對不同的需求,去選擇演算法,改良演算法。我的數學功底不強,太難的公式我看不懂,太高深的思想我理解不了,我主要以應用為主,不以解釋數學公式為主。

2019/1/3

第一章

什麼是演算法?演算法有啥用?

第二章

以排序演算法為例子,介紹了貫穿本書的一些程式寫法,表達規範。提到了分治演算法,在第四章會有詳細的介紹。 

第三章 

介紹了一些用來表示函式執行時間的符號。弄清楚O(n),Θ(n),Ω(n),這三個是什麼含義就行了。

第四章

 講了分治演算法的核心思想,如下:

分解:將大問題劃分為一些子問題,子問題的形式與原問題一樣,但是規模更小。比如我想研究100個人身高排序,那麼我先研究2個人身高怎麼排序。

解決:遞迴的求解子問題,如果子問題的規模足夠小,則停止遞迴,直接求解。這是分治思想最關鍵的地方,這個地方寫程式的時候會遇到的問題是,函式的形參怎麼設定,函式的返回值怎麼設定。

合併:根據遞迴函式返回的資料,進行整合,從而求解整個問題。

這個章節的Strassen方法吸引著我,它的作用是求解矩陣相乘,比一般的行×列求和時間快。但是也有一些缺點,有興趣研究的自行百度。

2019/1/4 

第五章

本章介紹了概率分析和隨機演算法。介紹了一些概率問題的書寫規範,表達方式。

(1)僱傭問題:每天要面試一個應聘者,這個應聘者比現在工作崗位上的人能力強,就用他,但是會產生昂貴的費用......我們希望計算僱傭一個新的辦公助理的期望次數。通過用隨機演算法,得到答案是Inn次。

介紹了兩個產生隨機陣列的方法:隨機優先順序法,隨機交換法(better,產生的記憶體小,速度快一些),原則上是產生一個均勻隨即排列。

(2)生日悖論(概率分析,下面這三個例子都是概率分析問題):一個屋子裡的人數必須要達到多少人才能使其中兩個人生日達到50%。

(3)球與箱子: 有若干個球,b個箱子,要投多少次球,才能使每個箱子裡至少有一個球?

(4)特徵序列:假設拋投一枚標準的硬幣n次,最長連續正面的序列的長度期望(平均)是多少?(沒看懂推導過程,難)

(5)線上僱傭:對於上面的僱傭問題, 如何儘量實現最小化花費與僱到最好的人(沒看懂推導過程,難)

(6)查詢一個無序陣列:這是思考題裡面的一個問題,如何快速的在一個n元陣列中,找到某一個數。題目中說的第三種演算法我比較贊同,但是我沒有進行數學驗證。

2019/1/9

第六章

本章介紹了一種堆排序的排序方法。這個方法比插入排序方法快(插入排序是O(n^2)),比分治,也就是歸併排序方法節省空間(歸併演算法,子問題的解決需要多餘的空間,這對記憶體小的機器是致命的)

                                                                        

這個圖,就是堆排序的最重要的思想。綠的是第0層,有一個元素,藍色是第1層,有兩個元素,當然了,下面還有很多層,每層元素的個數是2^n。這兩個藍色的結點叫這個綠色結點的孩子(書上是起這個名字,不是我起的)。每個元素代表一個值,這個“堆”,分為最大堆和最小堆,一般我們分析問題用最大堆,最大堆的性質就是我上面這個圖中,綠色的值必須比兩個藍色的值中最大的值還大。每一層都是這個樣子,每個結點都是這樣。每個藍色還有他的兩個孩子,也得符合這個性質。

從這個性質,引出了一系列最大堆的操作方法:建堆,維護堆,堆排序,優先佇列。這幾個方法也是本章著重講解的,很簡單,不難,我看了虛擬碼後,說到底就是遞迴+三個數值找最大。其他的也沒什麼。

在本章的思考題中,在建堆的方法上,是從上向下還是從下向上建,討論了一下,最終通過舉例論證,從下向上的方法是最佳的,在最差情況下所用時間少。

在本章註記中,提到了Dijkstra演算法,正好最近在研究全域性規劃的演算法,感覺這些大方向都是挺相似的。繼續研究吧。