演算法複雜度分析

2021-10-10 20:19:03 字數 3415 閱讀 8630

時間複雜度

每乙個演算法題,都會有乙個時間限制和空間限制。本文就拿時間限制為1s來討論.

就目前來說個人計算機1s大概可以執行3e8次運算左右。

所以時限1s,我們要保證程式運算次數不超過3e8

時間複雜度一般分為 $ o(n^2) $ o(n

log2

n)

o(nlog_2n)

o(nlog

2​n)

o (n

)o(n)

o(n)

o (l

og2n

)o(log_2n)

o(log2

​n)o(1

)o(1)

o(1)

在某一題中:

如果 n > 100000000 , 就需要考慮用 常數的時間去解決 或者 o(l

og2n

)o(log_2n)

o(log2

​n) 的時間複雜度

如果 n 在 100000 左右, 就可以考慮 o(n

log2

n)

o(nlog_2n)

o(nlog

2​n)

o (n

)o(n)

o(n)

的演算法如果 n 在 10000 左右, 那麼 o(n

2)

o(n^2)

o(n2

) 的演算法也可以

如果 n 在 500 左右, 那麼 o(n

3)

o(n^3)

o(n3

) 的演算法也行

一般我們算時間複雜度的時候,只要估算一下就可以了,不需要算到具體的值。

舉個例子:

int ans =

0, n =

100000

;for

(int i =

0; i <= n;

++i)

ans +=1;

for(

int i =

1; i <= n; i *=2)

ans +=

1;

第乙個 for 迴圈一共運算 n 次, 所以是 o(n

)o(n)

o(n)

的第二個 for 迴圈 i 每次 乘 2, 所以是 o(l

og2n

)o(log_2n)

o(log2

​n) 的

所以兩個 for 迴圈加在一起, 就是 o(n

+log

2n

)o(n + log_2n)

o(n+lo

g2​n

) 的,由於 n

nn 很大, log

2n

log_2n

log2​n

相比於 n

nn 來說,可以忽略不計,所以時間複雜度就是 o(n

)o(n)

o(n)

的。再舉個例子:

題目:給定乙個整數陣列 nums 和乙個目標值 target,陣列的值是公升序排列的,陣列的長度為 n。

請你在該陣列中找出和為目標值的那 兩個 整數,每個數只能被用一次,並返回他們的陣列下標。

示例:

給定 nums =[2

,7,11

,15], target =

9因為 nums[0]

+ nums[1]

=2+7

=9所以返回 [0,

1]

如果 n < 1000 , 我們就可以用 o(n

2)

o(n^2)

o(n2

) 的方法做。

這個方法就是兩重 for 迴圈,列舉兩個位置,判斷這兩個位置的和是不是 target 。

class

solution}}

return ans;

}}

如果n < 100000, 這個時候 o(n

2)

o(n^2)

o(n2

) 的方法就行不通了,但是可以使用 o(n

log2

n)

o(nlog_2n)

o(nlog

2​n)

的方法先迴圈一遍,把所有的值和對應的下標存到 hashmap 中, hashmap 每次的查詢時間是 o(l

og2n

)o(log_2n)

o(log2

​n) 的,

再迴圈一遍每個位置,讓 sub = target - nums[i] , 在 hashmap 中找 sub, 如果可以找到,就存在這樣兩個位置。

總的時間複雜度為 o(n

+nlo

g2n)

o(n + nlog_2n)

o(n+nl

og2​

n), 也可以說成 o(n

log2

n)

o(nlog_2n)

o(nlog

2​n)

class

solution

}return ans;

}}

如果 n < 10000000, o(n

log2

n)

o(nlog_2n)

o(nlog

2​n)

的方法也不行了, 這個時候就需要 o(n

)o(n)

o(n)

的演算法。

需要注意到這個陣列是公升序的。

先設兩個指標 i = 0, j = n-1; 代表我要找的兩個位置。

如果 i 向右移動, 兩個位置的加和會變大,

如果 j 向左移動, 兩個位置的加和會變小。

首先讓 nums[i] + nums[j] 如果和大於 target , j 向左移動, 如果和小於target, i 向右移動, 知道找到最後的位置。

如果 i >= j , 就會跳出迴圈, 所以每個位置只會被訪問一次,時間複雜的也就是 o(n

)o(n)

o(n)

class

solution

if(nums[i]

+ nums[j]

> target) j--

;else i++;}

}}

空間複雜度

空間複雜度就是看額外開了多少空間。

如果開了常數個空間,那就是 o(1

)o(1)

o(1)

的如果開了乙個陣列,有 n 位, 那麼就是 o(n

)o(n)

o(n)

的一般的題目不太會卡空間,空間複雜度也就是和時間複雜度差不多算就可以了。

演算法複雜度分析

分析非遞迴演算法效率的通用方案 1.決定用哪個 哪些 引數作為輸入規模的度量 2.找出演算法的基本操作 作為一規律,它總是位於演算法的最內層迴圈中 3.檢查基本操作的執行次數是否只依賴輸入規模。如果它還依賴一些其他的特性,則最差效率 平均效率以及最優效率 如果必要 需要分別研究。4.建立乙個演算法基...

演算法複雜度分析

演算法分析的四個漸進表示法 一般,o裡的,取最小的 一般,裡的,取最大的 一般分析時間複雜度,且常考慮最壞複雜度,常用o分析 三法則 法則一 如果t1 n o f n t2 n0 o g n t1 n t2 n max o f n o g n t1 n t2 n o f n o g n 法則二 如果...

演算法複雜度分析

類別name 名字交換類排序 quicksort 快速排序 交換類排序 bubble sort 氣泡排序 選擇類排序 selection sort 選擇排序 選擇類排序 heapsort 堆排序插入類排序 insertion sort 插入排序 插入類排序 shell sort 希爾排序 bucke...