上次我們說了說時間複雜度的大小,今天我們就來分析一下這些時間複雜度
n = 100 # 1 次
sum = (1 + n) *n / 2 # 1 次
print(sum) # 1 次
上述演算法程式的 f(n) = 3,可能有人看到這會說那麼時間複雜度就是 o(f(n)) = o(3),其實這個是錯的,這個函式的時間複雜度其實是 o(1)。這個對於初學者來說是很難理解的一種結果,其實你可以把 sum = (1 + n) * n / 2 多複製幾次再來看:
a = 100 # 1 次
sum = (1 + n) * n / 2 # 1 次
sum = (1 + n) * n / 2 # 1 次
sum = (1 + n) * n / 2 # 1 次
sum = (1 + n) * n / 2 # 1 次
sum = (1 + n) * n / 2 # 1 次
sum = (1 + n) * n / 2 # 1 次
print(sum) # 1 次
上述演算法的 f(n) = 8,事實上你可以發現無論 n 為多少,上述兩段**就是執行 3 次和執行 8 次的區別。這種與資料的規模大小 n 無關,執行時間恆定的演算法我們就叫它具有 o(1) 的時間複雜度。不管這個常數是多少,我們都記作是 o(1),而不是 o(3) 或者是 o(8)。
cnt = 1
while cnt < n:
cnt *= 2 # o(1)
上面的演算法程式的時間複雜度就是 o(logn),這個是怎麼算出來的呢?其實很簡單:上述的**可以解釋成 cnt 乘以多少個 2 以後才能大於等於 n,我們假設個數是 x,也就是求 2^x = n,即 x = log2n,所以這個迴圈的時間複雜度就是 o(logn)。
最後呢,我們來看看下面的這個例子,借助這段**來詳細的說一下我們如何對其時間複雜度進行詳細的分析:
a = 1
b = 2
c = 3
for i in range(n):
for j in range(n):
x = i * i
y = j * j
z = i * j
for k in range(n):
u = a * k + b
v = c * c
d = 4
上面的**沒有任何意義,甚至不是乙個可執行的**,我只是用來說明你在以後如何對**進行執行分析,關於**本身可不可以執行,就不需要你在這關心了。
上面的**其實我們要分的話可以分成 4 部分:第 1 部分是 a,b,c 這 3 個賦值語句,執行次數也就是 3 次;第二部分是 3n^2,因為是迴圈結構,裡面有 x,y,z 這 3 個賦值語句,每個語句執行了 n^2 次;
第 3 部分是 2n,因為裡面是 2 個賦值語句,每條語句被執行了 n 次;最後第 4 部分是常數 1,只有 d 這麼 1 條賦值語句。所以我們得到的 t(n
) = 3+3n^2 +2n+1 = 3n^2+2n+4,看到指數項,我們自然的發現是 n^2 做主導,當 n 增大時,後面兩項可以忽略掉,所以這個**片段的數量級就是 o(n^2)。
dfs時間複雜度 時間複雜度 空間複雜度
時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...
時間複雜度和空間複雜度(二)
演算法的時間複雜度的定義 在進行演算法分析時,語句總的執行次數t n 是關於問題規模 n的函式,進而分析 t n 隨n 的變化情況並確定t n 的數量級。演算法的時間複雜度就是演算法時間量度,記作 t n o f n 它表示隨問題規模 n的增大,演算法執行時間的增長率和 f n 的增長率相同,稱作演...
時間複雜度和空間複雜度 二
演算法時間複雜度的定義 進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作t n o f n 它表示隨問題規模n的增大,演算法執行時間的增長率和f n 的增長率相同,稱作演算法的漸進...