本書是基於演算法導論第一節課的總結。主要總結演算法分析中的時間複雜度,並通過排序演算法中的插入排序和歸併排序來分析。文章中的**由go語言實現
分析演算法執行的快慢,主要有以下幾個方面決定:輸入資料的大小(data size),輸入資料的好壞,在什麼樣的平台上執行。乙個好的程式或者軟體,需要對輸入的物件有一定的研究。比如排序演算法,在size<30的情況下插入排序是最為理想的排序演算法,當size>100之後,歸併排序的速度就非常的具有優勢了。因此在當前高階語言的成熟的排序演算法中,對於乙個大資料量文字的排序,在裡面處理小資料量片段的時候,會使用插入排序來實現。
考慮到以上幾個方面的差異,在演算法研究中,有乙個很重要的思想,漸近分析(asymptotic analysis)因為對於 θ(n
)\theta(n)
θ(n)
和θ (n
2)
\theta(n^2)
θ(n2
),即使後者執行在超級計算機上,前者執行在普通計算機上,當n大到一定程度之後,θ(n
)\theta(n)
θ(n)
會比θ (n
2)
\theta(n^2)
θ(n2
)快。這就是漸近分析的作用,忽略了機器常數,又考慮了演算法執行時間的增長。
對於乙個(a0
,a1.
..an
−1
)(a_0, a_1...a_)
(a0,a
1..
.an−
1),將其進行排序,
先看排序問題的偽**:
for j = 1 to n-1
do key = a[j]
i <- j-1
while i > 0 && a[i] > key
do a[i+1] <- a[i]
i <- i-1
a[i+1] = key
下面是使用go語言實現的排序演算法:
func insertsort(a int)
for j := 1; j < length; j++
a[i+1] = key
}}
像這樣的**,我們可以得到排除掉時間常數,每次迴圈需要最多需要遍歷的次數為j,所以t(n
)=1+
2+..
..n−
1t(n)=1+2+....n-1
t(n)=1
+2+.
...n
−1因此其時間複雜度為θ(n
2)
\theta(n^2)
θ(n2
)同樣對於上面的**,使用歸併排序的偽**為:
if n = 1 done
other recursirely sorting two part and merging a[0...n/2-1] and a[n/2...n-1]
devide the left and right part to smaller part, until n=1
下面是使用go語言實現的歸併排序演算法:
func mergesort(a int, left, right int)
mid := (left+right)/2
mergesort(a, left, mid)
mergesort(a, mid+1, right)
var temp int
tempmid := (len(temp)-1)/2
tempright := len(temp)-1
i, j:= 0, tempmid+1
for i <= tempmid && j <= temprightelse
} if j > temprightelse if(i > tempmid)
}func mergesort(a int)
mergesort(a, 0, length-1)
}
我們來考慮將兩個有序數組合為乙個有序陣列的過程,是需要變數這兩個陣列的所有元素的,因此在遞迴樹的每一層所需要的時間損耗為θ(n
)\theta(n)
θ(n)
遞迴樹有多少層呢 ? lg(n)
\lg(n)
lg(n)
因此演算法的時間複雜度為θ(n
∗lg(
n)
)\theta(n*\lg(n))
θ(n∗lg(
n)) 這個演算法是比上面的插入排序在大資料量的情況下,是具有非常大的優勢的。
const thresholdvalue int = 8
func mergesort(a int, left, right int)
if right - left > thresholdvalue
.........
}
package main
import "testing"
func benchmarkmergesort(b *testing.b)
for i:= 0; i < b.n ;i++
}func benchmarkinsertsort(b *testing.b)
for i:= 0; i < b.n ;i++
}//執行結果
時間 空間複雜度分析 01
分析乙個演算法指的是確定其執行時所需要使用的資源的量 如時間和記憶體 演算法大多被設計用來擔任處理大量輸入的工作,所以演算法的效率和複雜度取決於時間和空間複雜度。時間複雜度就是乙個演算法在一定輸入量下的執行時間。相似的,空間複雜度是在程式執行期間是需要使用的計算機記憶體的大小。總的來說,程式所需要的...
演算法時間複雜度分析
定義 如果乙個問題的規模是n,解這一問題的某一演算法所需要的時間為t n 它是n的某一函式 t n 稱為這一演算法的 時間複雜性 求解演算法的時間複雜度的具體步驟是 1 找出演算法中的基本語句 演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。2 計算基本語句的執行次數的數量級 ...
演算法分析時間複雜度
對乙個演算法的分析,很多時候我們更關心演算法執行的時間複雜度。演算法的時間複雜度中,我們關心演算法執行的時間上界。即大o階分析方法。時間複雜度的分類 1 沒有迴圈遞迴的基本都是常數階。2 有一層迴圈的就是線性階。for int i 0 i dosth 3 對數階 一般類似如下 while i i i...