系統執行次數就為時間。
演算法的時間量度
語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。
記作t(n)= o(f(n))
表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同
這裡主要有三個方法
用常數1期待執行時間的所有加法常數
保留最高項
去除最高項的係數
int n =
0, s =0;
n =100
;s =(1
+n)*n/2;
printf
("這是示例1\n");
printf
("常數階\n");
printf
("時間複雜度為o(1)\n"
);
解析:時間複雜度為o(1),因為t(n)是關於問題規模n的函式,而這裡只有s = (1+n)*n/2這句**關於n,所以為o(1)。簡單來說演算法的執行時間不隨問題規模n的增加而增。
int i =
1,n =
100,sum =0;
for(i =
0; i < n ;i++
)printf
("這是示例2\n");
printf
("線性階,這種非巢狀的迴圈\n");
printf
("時間複雜度為o(n)\n"
);
解析:這裡有個for迴圈,隨著n的增大,時間也增大,所以這裡為o(n)。
int i =
1,j =
0,n =
100;
for(i =
0; i < n ;i++)}
printf
("這是示例3\n");
printf
("平方階,這種是巢狀的迴圈\n");
printf
("時間複雜度為o(n^2)\n"
);
解析:這裡時間複雜度為o(n2),是因為這裡有個for迴圈裡面只巢狀了乙個,如果最裡面的for迴圈再有巢狀for迴圈,那麼時間複雜度就為o(n^3)
這裡再拿出乙個示例,複雜度也為o(n2)
int i =
1,j =
0,n =
100;
for(i =
0; i < n ;i++
)}
解析:演算法執行總次數為n+(n-1)+(n-2)+……1
那麼我們優化一下為 n(n+1)/2,再化簡為n2/2+n/2。根據我們上面的方法,保留最高項(此時為n2/2),再去除最高項的係數,此時就為n2。
int i =
1,n =
100;
while
(i < n)
printf
("這是示例4\n");
printf
("對數階\n");
printf
("時間複雜度為o(logn)\n"
);
解析:每次 i * 2 之後比較n,大於就退出。這裡假設我們有x個2相乘後大於n。算出x就是時間複雜度!
因為 2^x = n
所以有 log(2)n = x 所以時間複雜度o( logn )
上面講解了常數階、線性階、平方階和對數階,那麼現在就是將上面幾種,通過函式的方式組合起來。
int i,j;
for(i =
0; i < n; i++
)void
function
(count)
解析:for迴圈的是時間複雜度為o(n),函式function的複雜度為o(1),所以整體的時間複雜度為o(n)
n++
;//執行1次
function
(n);
//執行n次
for(i =
0; i < n; i++
)for
(i =
0; i < n ;i++)}
void
function
(count)
}
例子
時間複雜度
名稱5256525
o(1)
常數階3n+4
o(n)
線性階3n2+5n+91
o(n2)
平方階9log(2)n+4
o(logn)
對數階2n+3nlog(2)n+14
o(nlogn)
nlogn階
n3+5n2+6
o(n3)
立方階2^n
o(2^n)
指數階這裡簡單用關係總結
資料結構和演算法學習筆記
資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及它們之間的關係和操作等相關問題的學科。程式設計 資料結構 演算法 簡單來說資料結構就是關係,元素相互之間存在的一種或多種特定關係的集合。1.1 邏輯結構和物理結構 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條...
演算法學習 資料結構2
1 資料結構概述 數結構是計算機中對資料的一種儲存和組織方式,同是也泛指相互之間存在一種或多種特定關係的資料的集合。2 資料結構中的基本概念 資料 data 資料是資訊的載體,其能夠被計算機識別 儲存和加工處理,是電腦程式加強的 原材料 資料元素 data element 資料元素是資料的基本單位,...
資料結構和演算法學習筆記 棧
引入問題 如何實現瀏覽器的前進後退功能?如何理解棧?後進者先出,先進者後出,這個就是典型的 棧 結構 當某個資料集合只設計在一端插入和刪除資料,並且滿足後進先出的特性,我們就應該首選 棧 這種資料結構 如何實現乙個棧?用 陣列實現的叫順序棧 用鍊錶實現的鏈式棧 基於陣列實現的順序棧 public c...