求極限
n->無窮大:
表示式n:–>無窮大
表示式1/n:—>0
(2n2+2n3+n)/n^3
2/n+2+1/n^2
n–》無窮大的時候:
2/n–》0
1/n^2-》0
2–》常數—》此演算法的時間複雜度是n^3
時間複雜度的概念:
執行的次數和同數量級(n最高次方數)取商是常數
,那麼同數量級就是這個演算法的時間複雜度
時間複雜度的計算過程:
1 算出每一行語句執行的次數
2 求和,推導出乙個n的表示式t(n)
3 找出同數量級的表示式(n的最高次方)
4 t(n)/同數量級–>常數,那麼同數量級就是此演算法的時間複雜度
舉例1:
for i in range(n): #n
for j in range(5) : #5n
print(i,j) #5n
print(100) #1
t(n)=n+5n+5n+1=11n+1
第三步:同數量級:n
第四步:(11n+1)/n=11
時間複雜度:t(n)=o(n)
舉例2:
常數階temp=i;
i=j;
j=temp;
以上三條單個語句的頻度均為1,該程式段的執行時間是乙個與問題規模n無關
的常數。演算法的時間複雜度為常數階,時間複雜度記作t(n)=o(1)。
如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執
行時間也不過是乙個較大的常數。此類演算法的時間複雜度是o(1)。
舉例3:
n階:for i in range(n): #n
print(1) #n
2n–>n
時間複雜度:o(n)
舉例4:
n2階:
for i in range(n): #n
for j in range(n): #n^2
print(1) #n^2
t(n)=2n^2+n
時間複雜度:o(n)=n^2
舉例5:
n^3階:
for i in range(n): #n
for j in range(n): #n^2
for m in range(n): #n^3
print(1) #n^3
t(n)=2n3+n2+n
時間複雜度:o(n)=n^3
舉例5:
對數階i=1; ①
while (i<=n) #x表示它的執行次數
i=i2; ② 每執行一次,都會2,所以執行次數為2的f(n)次方
解:語句1的頻度是1,
設語句2的頻度是f(n), 則:2^f(n)<=n;f(n)<=log2n
取最大值f(n)= log2n,
時間複雜度:t(n)=o(log2n )
技巧:迴圈n的時候,迴圈體裡面有了一些條件,讓n的執行次數變小,那麼就可以認
為是log2n的時間負責度
舉例6:
n的對數階:nlog2n
for i in range(n):
i=1; ①執行1次
while (i<=n) #x表示它的執行次數
i=i*2;
時間複雜度:t(n)=o(nlog2n )
時間複雜度常用的記憶法:
1)訪問陣列中的元素是常數時間操作,或說o(1)操作。
2)乙個演算法如 果能在每個步驟去掉一半資料元素,如二分檢索,通常它就取o(logn)
時間。3)用strcmp比較兩個具有n個字元的串需要o(n)時間。
4)常規的矩陣乘演算法是o(n^3),因為算出每個元素都需要將n對 元素相乘並加到一起
,所有元素的個數是n^2。
5)指數時間演算法通常**於需要求出所有可能結果。例如,n個元 素的
6)集合共有2n個子集,所以要求出所有子集的演算法將是o(2n)的。指數算
7)法一般說來是太複雜了,除非n的值非常小,因為,在 這個問題中增
8)加乙個元素就導致執行時間加倍。
在計算時間複雜度時,我們一般使用的大o表示法,其時間複雜度,從小到大的排序是
:(1) < (logn)< (n)< (nlogn)< (n^2)<…< (2^n)< (n!)
時間複雜度越大,時間越多,算的越慢
穩定排序
a=[1,2,-1,-2,3,5,3]
排序:用乙個演算法排序,排序之後,2個3(任意的多個相等值)的前後相對位置沒有
發生變化。換句話說,在排序中,2個3沒有進行過交換,那麼就叫穩定排序。
複雜度計算
在1 n 中,能被 2整除的有 n 2個,能被 3整除的有 n 3個,則該演算法的複雜度可這樣計算 o n n 2 1 n 3 2 n 5 3 n 7 4 即o n n n 考慮到6這個數,它既是2的倍數,也是3倍數,因此還要用到容斥原理。設能被第 i個素數整除的正整數的集合為ai。對於特定的乙個整...
計算時間複雜度與空間複雜度
如何衡量乙個演算法的好壞?複雜度 空間複雜度 時間複雜度 事後統計法 就是在演算法的程式執行結束後,根據實際執行結果衡量演算法好壞 事前估計法 就是在程式執行之前,先按照程式 來預估演算法的好壞 時間複雜度 用基本指令的執行次數而不是執行時間代表時間複雜度,同乙個程式在不同配置的機器下的執行時間不一...
時間複雜度和空間複雜度計算
時間複雜度 首先要說的是,時間複雜度的計算並不是計算程式具體執行的時間,而是演算法執行語句的次數。當我們面前有多個演算法時,我們可以通過計算時間複雜度,判斷出哪乙個演算法在具體執行時花費時間最多和最少。常見的時間複雜度有 常數階o 1 對數階o log2 n 線性階o n 線性對數階o n log2...