程式或演算法的時間複雜度 演算法 筆記

2021-10-04 03:14:05 字數 3452 閱讀 4450

概念:乙個程式或演算法的時間效率,也稱時間複雜度,複雜度

計算複雜度的秩統計執行次數最多的那種固定操作的次數。

分類:平均複雜度和壞複雜度

注意:如果複雜度時多個n的函式之和,則只關心隨n的增長增長最快的那個函式

名稱複雜度

常數複雜度

o(1)

對數複雜度

o(log(n))

線性複雜度

o(n)

多項式複雜度

o(n的k次方)

指數複雜度

o(a的n次方)

階乘複雜度

o(n!)

插入排序,選擇排序,氣泡排序

o(n方)

快速排序

o(n*log(n))

二分查詢

o(log(n))

問題

a心裡想乙個1-10000之間的數,b來猜,可以問問題,a只能回答

是或者否。

怎麼猜才能問的問題次數最少?

非二分

是1嗎?是2嗎?。。。。是999那? 平均要問500次

二分法

大於500?大於750?大於625? 每次縮小猜測範圍到上次的一半,只需要10次

二分查詢函式

寫乙個函式binaryseach,在包含size個元素的,從小到大排序的int陣列a裡查詢元素p,如果找到則返回元素下標,如果找不到則返回-1.要求複雜度o(log(n))

binarysearch

int

binarysearch

(int a,

int size,

int p)

return-1

;}

寫乙個函式lowerbound,在包含size個元素的,從小到大排序的int陣列a裡查詢比給的那個整數小的,下表達的元素。

int

lowerbound

(int a,

int size,

int p)

//複雜度o(log(n))

}return lastpos;

}

注意

注意:int mid=(l+r)/2;//取查詢區間正中元素的下標

為了防止(l+r)過大溢位 int mid=l+(r-l)/2;

問題:

求下面乙個方程的乙個根:f(x)=x3-5x2+10x-80=0;

求出的根位a,則要求|f(a)|<=10^-6;

解法:對f(x)求導,由一元二次方程求根公式知方程f(x)

的導函式=0無解,因此f(x)的導函式恆大於0.故f(x)單調增

f(x)在[0.100]內有乙個根,所所以考慮二分法。

二元法求方程的根

double eps=

1e-6

;doublef(

double x)

intmain()

printf

("%0.8f\n"

,root)

;printf

("%d"

,triedtimes)

;return0;

}

問題

輸入n(n<=100000)個整數,找出其中的兩個數,他們之和

等於整數m(假定肯定有解)。題中所有整數都能用int表示

解法一

用兩重迴圈,列舉所有的取數方法,複雜度是0(n2)的。

for

(int i=

0;i++i)

for(

int j=i+

1;j++j)

if(a[i]

+a[j]

==m)

break

;

100000*100000=100億,在各種oj上提交或參加程式

設計競賽,這樣的複雜度肯定會超時!

解法二

1)將陣列排序,複雜度o(nlog(n))

2)對陣列的每個元素a[i],在陣列中二分查詢m-a[i],看能否

找到。複雜度log(n),最壞也要查詢n-2次,所以查詢這部分的複雜度也是o(nlog(n))

這種解法的複雜度是o(n*log(n))

解法三

1)將陣列排序,複雜度o(nlog(n))

2)查詢的時候,設定兩個變數i和j,i的初值為0,j的初值為n-1看a[i]+a[j],如果大於m,就讓j減1,如果小於m就讓i加1,直至a[i]+a[j]=m;

這種解法的複雜度為o(nlog(n))

問題

農夫john建造了一座很長的畜欄,它包括n(2<=n<=100000)

個隔間這些小隔間的位置為x0,x1…xn1(0=解法一

先得到排序後的隔間座標x0…xn-1;

從1000000000/c到1依次嘗試這個"最大的最近距離d",找到的第乙個可行的就是答案。

嘗試方法:

1)第一頭牛放在x0

2)若第k頭牛放在xi,則找到xi+1到xn-1中第乙個位於[xi+d,1000000000]中的xj

第k+1頭牛放在xj.中不到這樣的xj,則d=d-1)再試

若所有的牛都能放下,則d即答案

複雜度:10000000000/c*n,即1000000000超時

解法二:

先得到排序後的隔間座標x0…xn-1

在[l,r]內用二分法嘗試"最大最近距離"d=(l+r)/2,(l,r初值為[1,1000000/c])

若d可行,則記住該d,然後再新的[l+r]中繼續嘗試(l=d+1)

若d不可行,則在新[l,r]中繼續嘗試(r=d-1)

複雜度 log(1000000000/c)*n

程式或演算法的時間複雜度

1.乙個程式或演算法的時間效率,也稱 時間複雜度 有時簡稱 複雜度 2.複雜度常用大的字母o和小寫字母n來表示,比如o n o n 等。n代表問題的規模。3.時間複雜度是用演算法執行過程中,某種時間固定的操作需要被執行的次數和n的關係來度量的。在無序數列中查詢某個數,複雜度是o n 4.計算複雜度的...

演算法的複雜度 演算法的時間複雜度和空間複雜度

在一次筆試題目中,發現了自己對於演算法的時間複雜度問題上並沒有完全清晰這個概念和計算方法,故上網尋找到比較好的詳細介紹來學習。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也...

演算法時間複雜度

乙個演算法的時間複雜度 time complexity 是指該演算法的執行時間與問題規模的對應關係。乙個演算法是由控制結構和原操作構成的,其執行的時間取決於二者的綜合效果。為了便於比較同一問題的不同演算法,通常把演算法中基本操作重複執行的次數 頻度 作為演算法的時間複雜度。演算法中的基本操作一般是指...