算法圖解 總結 及pdf文檔下載

### 更新:沒有想到會有小闊愛看...雖然人數不多但也很欣慰,特更新附上pdf文檔《算法圖解》:

鏈接:https://pan.baidu.com/s/1c7xsngUuA5kB1DnqmTGvAw
提取碼:vww1

(話說 如果對小闊愛有用的話 可以幫我點一下旁邊的小手手嗎?)

###

##定義:算法指的是解題方案的準確而完整的描述,是一系列解決問題的清晰指令算法代表着用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個算法有缺陷,或不適合於某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間複雜度時間複雜度來衡量。

1、二分查找

 

      二分查找是一種算法,其輸入是一個有序的元素列表,如果要查找的元素在其中 二分查找就返回其原位置;否則返回null。通俗的講就是折半查找,線性表採用順序存儲的結構,表中元素按關鍵字有序排列,將表中間的關鍵字與查找關鍵字比較,如果相等就查找成功,如果不相等就以中間位置爲界限將表分成前後兩個子表,如果中間位置的關鍵字大於查找的數則查前一表單,如小於則查後一表單,不斷縮小查找範圍。

        對於包含n個元素的列表,用二分查找最多需要log2n(以2爲底n的對數)而簡單查找最多需要n步。

 

2、大O表示法

     計算機科學中,大O表示法被用來描述一個算法的性能或複雜度。大O表示法可以用來描述一個算法的最差情況,或者一個算法執行的耗時或佔用空間(例如內存或磁盤佔用)。即大O表示法指的並不是以秒爲單位的速度,是比較操作數,指出了算法運行時間的增速。

    O(操作數)   O(log n)   <log n就表示log2n>

 

常見大O運行時間:

· O(log n ),也叫對數時間,這樣的算法包括二分查找。

· O (n),也叫線性時間,這樣的算法包括簡單查找。

· O (n* log n ),這樣的算法包括快速排序——一種速度較快的排序算法。

· O (n2 ),這樣的算法包括選擇排序——一種速度較慢的排序算法。

· O (n!),這樣的算法是一種非常慢的算法。包括旅行商問題的解決方案。

 

 

算法的速度指的並不是時間 而是操作數的增速。

 

 

 

3、排序

      數組,鏈表

      數組的話意味着所有的元素在內存中都是連在一起的。一般爲了添加新元素會有 預留座位 但是會有可能額外請求的內存用不上 浪費了內存,或者預留不夠 這兩個缺點

      鏈表的每個元素都儲存了下一個元素的地址,內存是隨機的,因此添加元素只需要將其放入內存中,將其地址儲存到前一個元素中。

      鏈表的優勢在於添加元素方面,數組在於地址方面。

 

 

      當需要讀取鏈表的最後一個元素時,不能夠直接讀取,因爲不知道它的地址只能挨個訪問元素,直至訪問到最後一個元素。需要讀取所有元素時 鏈表的效率很高,但如果需要跳躍,鏈表的效率很低。而 數組則可以知道每個元素的地址,隨機讀取數據時數組的效率很高

 

 

數組的元素帶編號,從0開始而不是1.元素的位置稱爲索引,如說 元素20的位於索引1處

 

                讀取時間      插入時間

數組        O(1)                       O(n)

鏈表        O(n)                       O(1)

 

 

 

在中間插入

      使用鏈表時 插入元素只需要修改它前面的那個元素指向的地址,而使用數組則需要將後面的元素都後移,空間不夠還得將整個數組複製到別的地方。 刪除元素同理,鏈表也是更好的選擇。

                             讀取              插入              刪除

            數組         O(1)               O(n)               O(n)

            鏈表         O(n)               O(1)               O(1)

需要指出的是,僅當能夠立即訪問要刪除的元素時,刪除操作的運行時間才爲O(1)。通常我們都記錄了鏈表的第一個元素和最後一個元素 因此刪除這些元素時運行時間爲O (1)。

訪問方式:分 隨機訪問 和 順序訪問

      鏈表只能順序訪問 數組支持隨機訪問

 

 

實例:實際上,Facebook存儲用戶信息時使用的既不是數組也不是鏈表。假設Facebook使用的是一種混合數據:鏈表數組。這個數組包含26個元素,每個元素都指向一個鏈表。例如,該數組的第一個元素指向的鏈表包含所有以A打頭的用戶名,第二個元素指向的鏈表包含所有以B打頭的用戶名,以此類推。

 

 

4、選擇排序

找出最多的然後添加到一個新列表中

需要總時間爲 O(n*n),即O(n²)    {並非每次都需要檢查n 個元素。第一次需要檢查n 個元素,但隨後檢查的元素數依次爲n- 1, n-2, …, 2和1。平均每次檢查的元素數爲1/2×n,因此運行時間爲O (n× 1/2 × n)。但大O表示法省略諸如1/2這樣的常數(有關這方面的完整討論,請參閱第4章),因此簡單地寫作O (n× n)或O (n²)。}

 

5、遞歸

      僞代碼是對手頭問題的簡要描述,看着像代碼,但其實更接近自然語言。

編寫遞歸函數時,必須告訴它何時停止遞歸。正因爲如此,每個遞歸函數都有兩部分:基線條件(base case)和遞歸條件(recursive case)。遞歸條件指的是函數調用自己,而基線條件則指的是函數不再調用自己,從而避免形成無限循環。

    遞歸指的是調用自己的函數。每個遞歸函數都有兩個條件:基線條件和遞歸條件。棧有兩種操作:壓入和彈出。所有函數調用都進入調用棧。調用棧可能很長,這將佔用大量的內存。

 

6、快速排序

      分而治之-遞歸式問題解決方法

 

D&C將問題逐步分解。使用D&C處理列表時,基線條件很可能是空數組或只包含一個元素的數組。

實現快速排序時,請隨機地選擇用作基準值的元素。快速排序的平均運行時間爲O (nlog n)。

大O表示法中的常量有時候事關重大,這就是快速排序比合並排序快的原因所在。

比較簡單查找和二分查找時,常量幾乎無關緊要,因爲列表很長時,O(log n)的速度比O (n)快得多。

 

7、散列表

      散列函數“將輸入映射到數字”

      散列函數要求:1.必須是一致的。每次輸入同樣的數字輸出結果都必須一致。

                              2.它應該將不同的輸出映射到不同的數字中。輸入不同最好輸出都不同

 

緩存的工作原理:網站將數據記住,而不再重新計算。如果你登錄了Facebook,你看到的所有內容都是爲你定製的。你每次訪問facebook.com,其服務器都需考慮你感興趣的是什麼內容。但如果你沒有登錄,看到的將是登錄頁面。每個人看到的登錄頁面都相同。Facebook被反覆要求做同樣的事情:“當我註銷時,請向我顯示主頁。”有鑑於此,它不讓服務器去生成主頁,而是將主頁存儲起來,並在需要時將其直接發送給用戶。

 

散列表適合用於:

模擬映射關係;

防止重複;

      緩存/記住數據,以免服務器再通過處理來生成它們。

 

衝突:給兩個鍵分配的位置相同。

如果兩個鍵映射到了同一個位置,就在這個位置存儲一個鏈表。

如果兩個鍵映射到了同一個位置,就在這個位置存儲一個鏈表。

 

在平均情況下,散列表的查找(獲取給定索引處的值)速度與數組一樣快,而插入和刪除速度與鏈表一樣快,因此它兼具兩者的優點!但在最糟情況下,散列表的各種操作的速度都很慢。因此,在使用散列表時,避開最糟情況至關重要。爲此,需要避免衝突。而要避免衝突,需要有:較低的填裝因子;良好的散列函數

 

8、廣度優先搜索

廣度優先搜索能夠找出兩樣東西之間的最短距離

圖由節點和邊組成,一個節點可能與衆多節點直接相連,這些節點被稱爲鄰居

 

廣度優先搜索是一種用於圖的查找算法。解決兩種問題:1.從節點A出發有前往B節點的路徑嘛?    2.從節點A出發前往節點B的哪條路徑最短

按添加順序進行檢查——隊列,與棧類似,不能隨機的訪問隊列中的元素。隊列只支持兩種操作:入隊 出隊

隊列是一種先進後出的數據結構,棧是一種後進先出的數據結構。

散列表能夠將鍵映射到值,添加鍵-值對的順序不重要,因爲散列表是無序的

有向圖:其中的關係是單向的;

無向圖:沒有箭頭,直接相連的節點互爲鄰居。

      下面兩個圖是等價的:

 

 

壓入大致相當於 入隊,彈出大致相當於 出隊

 

廣度優先搜索的運行時間爲O(人數+邊數),通常寫作O(V+E),其中V爲頂點數,E爲邊數

 

拓撲排序,可以用來創建一個有序列表

 

樹:樹是一種特殊的圖,其中沒有往後指的邊

在數據結構中樹的特點是一對多,鏈表是一對一,圖是多對多。

 

無向圖中的邊不帶箭頭,其中的關係是雙向的

 

 

 

9、狄克斯特拉算法

廣度優先搜索 將得到最少的路徑,

狄克斯特拉 將得到最短時間的路徑 。這個算法給每段都分配了一個數字或者權重找出的是總權重最小的路徑。

狄克斯特拉算法對於每條邊都有關聯數字的圖——權重。帶權重的圖叫 加權圖,不帶則叫 非加權圖。

 

:意味着繞圈圈,環增加權重。繞環的路徑不可能是最短的路徑。無向圖意味着兩個節點彼此指向對方其實就是環,在無向圖中 每條邊都是一個環。狄克斯特拉算法只適用於有向無環圖。

如果有負權邊則不能使用狄克斯特拉算法,在包含負權邊的圖裏面,可使用 貝爾曼-福德算法。

 

10、貪婪算法

簡單易行。每步都採取最優的做法,每步選擇局部最優解,得到的就是全局最優解。顯然,貪婪算法不是在任何情況下都行之有效。

貪婪算法 不僅簡單而且通常運行速度很快

 

11、並集意味着集合合併

交集意味着找出兩個集合中都有的元素

差集意味着將從一個集合中剔除出現在另一個集合中的元素

 

NP完全問題 解決集合覆蓋問題——最佳做法:近似算法

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章