數據結構導論 二 時空性

經過上一章,http://www.javashuo.com/article/p-arcdicdl-mu.html中能夠知道數據結構分爲html

1.邏輯結構   包含:算法

1)集合數據結構

2)線性結構函數

3)樹形結構spa

4)圖結構設計

2.存儲結構code

1)順序存儲htm

2)鏈式存儲blog

3)索引存儲索引

4)散列存儲

以上也是重點須要進行了解的,

廢話很少說,跟着第一章走,算法的設計應該知足一下:

1.正確性 :保證是否正確

2.易讀性:是否簡單易懂

3.健壯性:在輸入非法數據時,是否出錯

4.時空性:分析 時間複雜度 和空間複雜度 提升算法效率(重點)

 

選擇最優算法的2各度量:

時間複雜度:算法運行時所須要的總步數(從開始運行到打斷點)

空間複雜度:算法執行時所佔的存儲空間(運行後存儲空間的大小)

 

合理地選擇一種或者幾種操做做爲「標準操做」

肯定每一個算法執行了多少次標準操做,並將這次數規定位該算法的計算量

 

時間複雜度的肯定計算量:

算法的最壞狀況時間複雜度:算法在全部輸入下的計算量的最大值爲計算量

(最壞時間複雜度是至關於運動會的接力棒,從開始到結束總共用的時間被稱爲最壞時間複雜度)

算法的平均狀況時間複雜度:算法在全部輸入下的計算量的加權平均值算法的計算量

(平均狀況時間複雜度,仍能夠用運動會接力來講,在一段時間內,所平均的值稱爲 加權平均)

最壞狀況時間複雜度和平均狀況複雜度統稱爲時間複雜度  

最壞狀況時間複雜度+加權平均狀況複雜度《= 時間複雜度     (最壞和加權是包含在時間複雜度內的)

void max(int a,b,c,d)
{a*=d;b*=d,c*=d;
if (a>b)x=a;
else x=b;
if (c>x)x=c;
printf("%d\n",x);}
/*有時間能夠拿筆算一下這個最壞時間複雜度是多少?*/

 

常見的時間複雜度按數量級遞增排列一次爲:

常數 O(1):不管執行多少行沒有循環等複雜結構的都是O(1)

int i,j;
i=2;
j=3 i
++; j++
i=i+j;

 

對數階O(long2n):

 1 int a; 2 while(a<n){ 3 a=a*2; 4 } 

在while循環裏面,每次都將 a 乘以 2,乘完以後,a距離 n 就愈來愈近了。咱們試着求解一下,假設循環x次以後,a 就大於 2 了,此時這個循環就退出了,也就是說 2 的 x 次方等於 n,那麼 x = log2n
也就是說當循環 log2n 後代碼就結束。所以這個代碼的時間複雜度爲:O(logn)

 

線性階O(n):

1 int i;
2 for(i=0,i<n,i++){
3 printf("*******");}

這段代碼,for循環裏面的代碼會執行n遍,所以它消耗的時間是隨着n的變化而變化的,所以這類代碼均可以用O(n)來表示它的時間複雜度。

 

線性對數階 O(nlong2n):

線性對數階O(nlogN) 其實很是容易理解,將時間複雜度爲O(logn)的代碼循環N遍的話,那麼它的時間複雜度就是 n * O(logN),也就是了O(nlogN)。

1 for(i=1,i<n,i++){
2 j=1;
3 while(j<n){
4 j=j*2;}}

 

平方階O(n2),

多項式階OnC),

指數階O(Cn)

咱們能夠將時間複雜度幾位輸入數據規模n的函數,若求解問題須要執行n2次操做,則記做O(n2)

 

時間複雜度與時間的關係

 

 

空間複雜度:

是一個算法在運行過程當中臨時佔用存儲空間大小的量度。

一個算法在執行期間所須要的存儲空間量包括如下部分:

程序代碼所佔用的空間;

輸入數據所佔用的空間;

輔助變量所佔用的空間;

相關文章
相關標籤/搜索