函式的漸近增長:給定兩個函式 f(n) 和 g(n) ,如果存在乙個整數n,使得對於所有的n>n,f(n)總是比g(n)大,那麼我們說f(n)的增長漸近快於g(n)
如圖
演算法時間複雜度的定義:在進行時間演算法分析時,語句總的執行次數t(n) 是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法的時間度量,記作:t(n) = o(f(n))。它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸進時間複雜度。其中f(n)是問題規模n的某個函式。
它定性描述了該演算法的執行時間,其作用: 時間複雜度是指執行演算法所需要的計算工作量
這樣用o()來體現時間複雜度的計法我們稱之為大o記法。
一般情況下隨著輸入規模的增大,t(n)增長最慢的演算法為最優演算法
如何分析乙個演算法的時間複雜度:
1、用常數1取代執行時間中的所有加法常數
2、在修改後的執行次數函式中,只保留最高端項。
3、如果最高端項存在且不是1,則去除與這個項相乘的常數
4、最後得到的結果就是大o階
例1 常數階:下列演算法的時間複雜度為o(1) 而不是o(8)
int sum = 0,n = 100;
printf("資料結構與演算法之時間複雜度");
printf("資料結構與演算法之時間複雜度");
printf("資料結構與演算法之時間複雜度");
printf("資料結構與演算法之時間複雜度");
printf("資料結構與演算法之時間複雜度");
printf("資料結構與演算法之時間複雜度");
sum = (1+n)*n/2;
例2 線性階:下列含單個迴圈體演算法的時間複雜度為o(n)
int i,n=100, sum=0;
for(i=0; i所以巢狀迴圈體演算法的時間複雜度為o(n×n×n······)(將巢狀的迴圈次數相乘)
例3 平方階:下列巢狀迴圈演算法的時間複雜度為o(n^2)
int i,j,n=100;
for(i=0;i其大o階位n的累加方程只保留最高次項,去除與這個項相乘的常數,得n2。
例3 對數階:下列迴圈的時間複雜度位o(logn).(此處log以2為底)
int i=1,n=100;
while(i解:2x=n => x=log(2)n
有多組迴圈語句則以迴圈次數最多的迴圈語句的迴圈次數來衡量時間複雜度。
常用的時間複雜度所耗費的時間從小到大依次是:
o(1) < o(logn) < o(n) < o(nlogn) < o(n2) < o(n3) < o(2n) < o(n!) < o(nn)
平均執行時間是期望的執行時間
最壞執行時間是一種保證。在應用中,這是一種最重要的需求,通常除非特別指定,我們提到的執行時間都是最壞情況的執行時間。
演算法空間複雜度
演算法的空間複雜度通過計算演算法所需要的儲存空間實現,演算法的空間複雜度的計算公式記作:s(n) = o(f(n)),其中,n為問題的規模,f(n)為語句關於n所佔的儲存空間的函式。
通常我們用「時間複雜度」來指執行時間的需求,用「空間複雜度」來指空間需求。
當直接要求我們求「複雜度」時,通常指的是「時間複雜度」。
資料結構與演算法二
資料結構作為一門學科主要研究資料的各種邏輯結構和儲存結構,以及對資料的各種操作。因此,主要有三個方面的內容 資料的邏輯結構 資料的物理儲存結構 對資料的操作 或演算法 通常,演算法的設計取決於資料的邏輯結構,演算法的實現取決於資料的物理儲存結構。邏輯結構 是指資料物件中資料元素之間的相互關係。其實這...
資料結構與演算法 二
佇列是一種特殊的線性表 線性結構 特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。佇列按照邏輯資料結構可以分為順序佇列和迴圈佇列....
資料結構與演算法(二)
介紹內容 大o表示法 1 演算法時間度量指標 賦值語句 一條賦值語句同時包含了表示式計算 和 變數儲存兩個基本資源2 聯絡 所以賦值語句被執行的次數與演算法執行的時間直接掛鉤 a 5b 6c 10for i in range n for j in range n x i j y j j z i i ...