略過
2.1 插入排序
這種方法類似於數學歸納法,只不過,數學歸納法是無限迭代的,而該方法在for或者while語句停止時,歸納停止,運用這種方法,可以幫我們有條理的證明某演算法在for或while迴圈上正確完備的達到了我們的期望。2.2 分析演算法
演算法的複雜度通常有以下幾種情況:
2.3 設計演算法
通常演算法設計的技巧有:
並以歸併排序舉例
在歸併排序中:
個人見解(以下就是在一本正經的扯淡)
為達成同一目標不同演算法之間的時間和空間差異並非是憑空產生的,演算法的時間優化往往來自於以下三個方面:
對於第一種情況,我們完全可以從一種演算法思想方法上看到,他就是大名鼎鼎的動態規劃
而對於第二種情況,我們可以從並查集身上看到,我們可以選擇find()操作為o(
1)而使union()操作為o(
n2)
第三種 在各種排序演算法上體現的尤為明顯 其中最明顯的就是桶排,它利用了作為自然數的自然排序,將已知範圍的自然數排序降低到了o(
n)的程度。
言歸正傳
歸併排序利用了排序本身的什麼特性才使其降低到nl
ogn 的程度呢?
答案也很簡答,當a大於b,b大於c,那麼我們無需比較就可以的出a大於c,那麼在歸併排序中**用到了這一點呢 ?
答案是歸併,也是歸併排序名稱的**。
將設有字序列 a1
a2a3
a4...
,和b1
b2b3
b4....
根據歸併排序的性質我們可以的出,a1
<
a4....
對於b1
,b2,
b3...
也是同理,那麼此時我們只要比較a1
與b1 我們就可以確定a1
為最大(最小)的元素,此時我們又可以將剩下的a2
,a3,
a4...
看做乙個新的a1
,a2,
a3..
的問題,直至一方序列為空,我們可以發先對於已排序的序列,我們只用o(
1)的複雜度就得出了序列中最大(最小)的元素.
那麼我們回頭來看看哪三種低效的排序演算法呢:
氣泡排序,雖然我們花了很大力氣(相當多的swap())得出他的最大值,但是其中的潛在蘊含的大小關係並沒有被我們利用到,對於插入排序也是同樣的結果,我們雖然選出了最大值,但對於下乙個最大值的選取並沒有絲毫的幫助.那麼插入排序呢?
有,我們可以用二分查詢利用這種關係,但是然後呢?我們還是得將後邊的元素移到後邊去,希爾排序和堆排序乃至歸併排序都各自找出了一套解決方案(其實他們本質是相同的),於是他們成了nl
ogn 的演算法。
當然,以上只是作者個人的胡扯罷了,各種奇妙的排序方案豈能是小小的一片文章可以談盡的.
演算法導論學習筆記 (1)
乙個acm若菜,趁著acm淡季,開始學習演算法導論了,經過一年的acm學習,逐漸的發現,學東西,深入才是王道,以前學習乙個演算法,總是看懂了就開始做題,到後來才發現很多題目,會演算法,卻不知道是用這個演算法,這就是演算法理解的不到位的後果,從今天開始,定下目標 1.深入系統的學習演算法,2.學會紙上...
《演算法導論》學習筆記(1)
時間複雜度 time complexity 0,1,1,2,3,5,8,13,21,34 數列中每個數都是其兩個直接前項的和。f nf fn 的生成規則 f n left f f n 1 1 n 1 0 n 0 end right.fn fn 1 fn 1 10 n 1n 1n 0 fibonacc...
演算法導論(1)
分治策略 1.遞迴式 用來描述遞迴求解的分治演算法的執行時間。求解遞迴式有三種方法 1 代入法,猜測乙個界,然後用數學歸納法證明這個界是正確的。2 遞迴樹法,將遞迴式轉換為一棵樹,利用遞迴式,將每層的代價以及深度都表示出來,節點代表不同層次產生的代價,最後利用邊界和技術求解。遞迴樹法常用來生成乙個好...