時間複雜度
每乙個演算法題,都會有乙個時間限制和空間限制。本文就拿時間限制為1s
來討論.
就目前來說個人計算機1s
大概可以執行3e8
次運算左右。
所以時限1s
,我們要保證程式運算次數不超過3e8
時間複雜度一般分為 $ o(n^2) $ o(n
log2
n)
o(nlog_2n)
o(nlog
2n)
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
2n)
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
g2n
) 的,由於 n
nn 很大, log
2n
log_2n
log2n
相比於 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
2n)
的方法先迴圈一遍,把所有的值和對應的下標存到 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
2n)
class
solution
}return ans;
}}
如果 n < 10000000, o(n
log2
n)
o(nlog_2n)
o(nlog
2n)
的方法也不行了, 這個時候就需要 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...