很多人會有疑問,複雜度分為時間和空間複雜度,現在有很多任務具監控統計執行時間和占用記憶體大小,為什麼還要去分析呢?
這種測試的的結果非常依賴當時的測試環境(硬體、網速等)
結果還受到資料量的影響。
所以我們需要通過時間空間複雜度來估計執行的效率。
int sumnumber(int n)
return sum;
}
分析:假設執行沒一行**的時間是time,那麼上面的**2,3行分別執行time,而4,5行是迴圈分別執行n*time,第7行執行時間是time。那麼這段**執行的時間是:time+time+2*n*time+time=2n*time+3*time
int calsum(int n){
int sum = 0;
for (int i = 1; i 分析:第2,8行執行時間time,第3行n*time,第4,5行分別是n*n*time。
那麼這段**執行時間是:
簡單的說就是**執行的時間t(n)與每行執行的次數n,成正比,用數學表示式:t(n)=o(f(n)).所以第乙個案例表示為:t(n)=o(2n+3);第二個案例表示為:t(n)=o(2n^2+n+2)。
當n趨近於無窮大時,低階、係數、常量對增長影響相對很小,所以我們他們的時間複雜程度分別是:t(n)=o(n)、t(n)=o(n^2)。
1.o(1)
o(1)是常量級時間複雜度,並不是只執行一句**,案例1中2,3行**雖然是2行執行,但是還是o(1);簡單的說只要沒有迴圈遞迴之類不隨n增大而變化得時間複雜度都是o(1).
2.o(n)、o(n^2)...o(n^x)
這類的時間複雜程度已經在案例中分析了,大概就是有迴圈、多重迴圈遞迴這類的。
3.o(logn)、o(nlogn)
int i=1;
while (i <= n) {
i = i * 2
}
可以看出i每次都會乘以2,什麼時候結束迴圈呢,2^x = n 當等於這個時候就是最好一次迴圈,現在只需要求出n就知道一共迴圈了幾次,兩邊同時取2的對數,log2^x = logn--> x= logn(輸入公式很麻煩,這預設是2的對數)。前面講到去掉低階,係數,常量因此這類時間複雜程度記做為 t(n) = o(logn).
如果理解上面的類容,那麼在這基礎上再巢狀乙個for迴圈時間複雜程度就是t(n)=o(nlogn).
其他複雜的時間複雜程度可以自己再進行查資料學習。
時間複雜程度大概表示的是資料規模與演算法**執行時間的正比關係,那麼空間複雜程度大概可以理解為資料規模與演算法所佔空間的正比 關係。知道時間複雜程度,空間複雜程度就非常簡單了。
void print(int n) {
int i = 0;
int a = new int
for (i; i和時間複雜程度相似,在上面**中只有在第3行申請了乙個陣列,在迴圈中進行賦值,所以空間複雜程度為o(n),其他的和時間複雜程度相似。
資料結構與演算法 複雜度分析
一 什麼是複雜度分析?1.資料結構和演算法解決是 如何讓計算機更快時間 更省空間的解決問題 2.因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。4.複雜度描述的是演算法執行時間 或占用空間 與資料規模的增長關係...
資料結構與演算法(一)複雜度分析
執行時間t n 與執行次數n成正比,即t n o f n 大o表示時間複雜度,又稱漸進時間複雜度,表徵 執行時間隨資料規模增長的變化趨勢。一定程度上可以模擬斜率 導數。1.只關注迴圈執行次數最多的 行,忽略常數 2.加法法則 總複雜度等於量級最大的那個時間複雜度 3.乘法法則 總複雜度等於巢狀的各個...
資料結構與演算法 02 複雜度分析
資料結構與演算法的本身解決的是 快 和 省 的問題。節省空間,且執行效率快,今天我們通過複雜度分析來考量 的執行效率,複雜度又分為時間複雜度和空間複雜度兩大類。事後統計法 通過運用工具監控的 執行的方法,統計 的執行時間和占用空間。這種方法無法真實的反應 的效能。1.1 測試結果非常依賴測試環境 受...