資料所在的容器器皿坑位。
方法/函式的數學本質從數學角度描述:i/o關係式 ,簡單描述為入參及右側表示式結果(input/output)。
y=f(n)=入參n構建的表示式。常量修飾係數+變數佔位入參。函式表示式的結果即複雜度參考值。
演算法的複雜度:時間方面的時間複雜度和空間相關的空間複雜度。
時間複雜度:指執行某演算法所需要的工作量耗時(時間消耗);
空間複雜度:指執行某演算法所需要的記憶體空間消耗(空間消耗);
時間資源和空間資源都屬於計算機資源的重要體現,演算法的複雜性是體現在執行某演算法時計算機所消耗資源的多少。
o()符號output後面圓括號中函式表示式f(n)=,代表某演算法的耗時資源/耗空間資源與資料量層級增長之間的關係(n代表輸入資料的量)。
時間複雜度為例:
時間複雜度為o(n):線性階複雜度代表資料量增大入參n倍,耗時資源增大表示式結果值的倍數n倍
比如簡單的迴圈遍歷演算法:
//迴圈遍歷n次即可得結果
count = 0;
for(int i = 0;i < 10 ; i ++)
時間複雜度為o(n^2):平方階複雜度代表資料量增大入參n倍時,耗時資源增大表示式結果值的倍數即n的平方倍,是比線性階複雜度消耗資源更多的時間複雜度。
比如氣泡排序演算法o(n^2):m個數排序,需要迴圈m*(m-1)/2次。
//冒泡演算法
- (void)bublealgorithm ;
int cnt = 20;
int count = 0;
for (int i=1; iarr[j+1])
count++;}}
[self printlist:arr length:cnt];
}
時間複雜度o(logn):對數階複雜度代表資料量增大入參n倍時,耗時資源增大表示式結果值的倍數即logn倍(log以2為底,即當資料量增大256倍時,耗時資源只增大log256倍即8倍,是比線性階複雜度消耗資源更少的時間複雜度)。二分查詢演算法時間複雜度為o(logn),每找一次排除一半可能範圍,256個資料中查詢只要找8次就可以找到目標。
int binarysearch(int a, int key)
return -1;
}
時間複雜度o(nlogn):線性對數階複雜度,表示式的結果值是nlogn,當資料量增大到256倍時,耗時資源增大到256*8=2048倍。歸併排序o(nlogn):
public void mergesort(int arr, int p, int q);
int mid = (p+q)/2;
mergesort(arr, p, mid);
mergesort(arr, mid+1,q);
merge(arr, p, mid, q);
}private void merge(int arr, int p, int mid, int q) else
}while(i <= mid)
while(j <= q)
for(int t = p; t <= q; t++)
}
o(1):常數階複雜度,表示式的結果值是1,永遠只需要一輪操作就可以尋找到目標,耗時資源最少,最低的時空複雜度,就是耗時與輸入資料量多少無關,無論輸入資料量增大多少倍,耗時/耗空間都不變,都是一步找到一步對映到。雜湊演算法是典型的o(1)時間複雜度,無論資料規模多大,都可以在一次對映計算後找到目標。
時間複雜度優劣對比:數量級越小表示演算法執行時間頻度越短則越優。
演算法的複雜度 演算法的時間複雜度和空間複雜度
在一次筆試題目中,發現了自己對於演算法的時間複雜度問題上並沒有完全清晰這個概念和計算方法,故上網尋找到比較好的詳細介紹來學習。演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也...
演算法的複雜度 時間複雜度與空間複雜度
通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...