在學習演算法與資料結構之前,首先得明白兩個複雜度分析,時間和空間。
先說時間,這裡並不是說一段程式具體會執行多少s,因為不同的電腦硬體會造成運算時間的差異,比如i9的cpu一定比i3的cpu跑的快;另一方面,不同的資料規模,也會造成同乙個演算法執行花費不同的時間,典型如排序演算法。
所以這裡,把每句程式的執行時間當作乙個單位時間,然後通過計算該程式執行了多少次,來計算時間複雜度的。例如:
for
(int i =
0;i < n; i++
)
這段**,第二行**執行的次數是最多的,會執行n次,所以,這段**的時間複雜度就是o(n)。在這裡,o是複雜度的標記符號。
類似的,如下面的例子:
for
(int i =
0; i < n; i++
)}
在這段**中,第三行**執行的次數最多,為n*n次,所以時間複雜度就是o(n2)。
o(n),o(n2)這算是最簡單,最常見的兩種時間複雜度了,那麼有沒有其他的時間複雜度呢?看下面這個例子:
int i =1;
while
(i < n)
那麼這段**執行了多少次呢。可以看到,在之前的兩個例子的分析中,我們首先是在找執行次數最多的那句**進行分析,這裡也一樣。
首先第三行**執行的次數是最多的;其次,數學比較好的同學應該能馬上反應過來,這其實就是乙個公比為2的等比數列,每一次的判斷條件可以寫成:201x
< n。
換句話說,當第三行**執行第 x 次的時候,迴圈結束,此時有2x=n, 則x = log2n, 於是,記該演算法的時間複雜度為o(logn)。
那或許有同學問了,如果為i = i * 3呢,大家還記得對數函式的換底公式嗎,可以動手算算看哦。
當然了,時間複雜度不僅僅只有這三種,其他複雜度的介紹會在後續具體的演算法中分析,感興趣的同學也可以主動去google。
相對時間複雜度來說,空間複雜度就太簡單了。空間複雜度並不是說一段**占用了多大的儲存空間,而是說,在一段**執行的過程中,額外申請了多少記憶體。舉個例子:
for
(int i =
0;i < n; i++
)
這段**執行過程中,並沒有額外申請任何的記憶體空間,所以空間複雜度為o(1)。
再看乙個例子:
int
a =
newint
[n];
for(
int i =
0; i < n; i++
)
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...