01演算法 時間複雜度分析

2021-10-03 07:23:18 字數 3127 閱讀 9911

本書是基於演算法導論第一節課的總結。主要總結演算法分析中的時間複雜度,並通過排序演算法中的插入排序和歸併排序來分析。文章中的**由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...