經過上一章,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)
時間複雜度與時間的關係
空間複雜度:
是一個算法在運行過程當中臨時佔用存儲空間大小的量度。
一個算法在執行期間所須要的存儲空間量包括如下部分:
程序代碼所佔用的空間;
輸入數據所佔用的空間;
輔助變量所佔用的空間;