Day2 時間複雜度演算法

2021-10-11 14:39:03 字數 2794 閱讀 9954

複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半

int

cal(

int n)

return sum;

}//總共執行了2n+2次

可以發現:所有**的執行時間 t(n) 與每行**的執行次數 n 成正比

t(n) 表示**執行的時間;n 表示資料規模的大小;f(n) 表示每行**執行的次數總和。因為這是乙個公式,所以用 f(n) 來表示。公式中的 o,表示**的執行時間 t(n) 與 f(n) 表示式成正比。

所以例子**執行時間 t(n) = o(2n+2) 就是大 o 時間複雜度表示法

大 o 時間複雜度實際上並不具體表示**真正的執行時間,只是表示**執行時間隨資料規模增長的變化趨勢,所以,也叫作漸進時間複雜度(asymptotic time complexity),簡稱時間複雜度

1. 只關注迴圈執行次數最多的一段**

大 o 這種複雜度表示方法只是表示一種變化趨勢 ,通常會忽略掉公式中的常量、低階、係數,只需要記錄乙個最大階的量級就可以啦

我們在分析乙個演算法、一段**的時間複雜度的時候,也只關注迴圈執行次數最多的那一段**就可以了。這段核心**執行次數的 n 的量級,就是整段要分析**的時間複雜度

int

cal(

int n)

return sum;

}

其中第 2、3 行**都是常量級的執行時間,與 n 的大小無關,所以對於複雜度並沒有影響。迴圈執行次數最多的是第 4、5 行**,所以這塊**要重點分析。這兩行**被執行了 n 次,所以總的時間複雜度就是 o(n)。 注:不是o(2n),仔細閱讀只關注迴圈執行次數最多的那一段**4,5行**執行次數一樣多,所以只用選取其中一段即可,就是o(n)

2. 加法法則:總複雜度等於量級最大的那段**的複雜度

int

cal(

int n)

int sum_2 =0;

int q =1;

for(

; q < n;

++q)

int sum_3 =0;

int i =1;

int j =1;

for(

; i <= n;

++i)

}return sum_1 + sum_2 + sum_3;

//100+n+n^2

}

**分為三部分,分別是求 sum_1、sum_2、sum_3。我們可以分別分析每一部分的時間複雜度,然後把它們放到一塊兒,再取乙個量級最大的作為整段**的複雜度。

第一段的時間複雜度是多少呢?這段**迴圈執行了 100 次,所以是乙個常量的執行時間,跟 n 的規模無關。即便這段**迴圈 10000 次、100000 次,只要是乙個已知的數,跟 n 無關,照樣也是常量級的執行時間。當 n 無限大的時候,就可以忽略。儘管對**的執行時間會有很大影響,但是回到時間複雜度的概念來說,它表示的是乙個演算法執行效率與資料規模增長的變化趨勢,所以不管常量的執行時間多大,我們都可以忽略掉。因為它本身對增長趨勢並沒有影響。

那第二段**是o(n)和第三段**是 o(n^2)

綜合這三段**的時間複雜度,我們取其中最大的量級。所以,整段**的時間複雜度就為 o(n^2)。也就是說:總的時間複雜度就等於量級最大的那段**的時間複雜度。那我們將這個規律抽象成公式就是:

如果 t1(n)=o(f(n)),t2(n)=o(g(n));那麼 t(n)=t1(n)+t2(n)=max(o(f(n)), o(g(n))) =o(max(f(n), g(n)))

3. 乘法法則:巢狀**的複雜度等於巢狀內外**複雜度的乘積

如果 t1(n)=o(f(n)),t2(n)=o(g(n));那麼 t(n)=t1(n)*t2(n)=o(f(n)) * o(g(n))=o(f(n)*g(n)).

當i>n時候才停止:i=1 ,21,22, 2^3 ,2^x

當 2^x>n時候停止,求出x的值,所以x=log2n ,所以的時間複雜度為o(log2n)

**所有對數階的時間複雜度都記為 o(logn) **

如果一段**的時間複雜度是 o(logn),我們迴圈執行 n 遍,時間複雜度就是 o(nlogn) 了。而且,o(nlogn) 也是一種非常常見的演算法時間複雜度。比如,歸併排序、快速排序的時間複雜度都是 o(nlogn)

演算法效率 1 時間複雜度 2 空間複雜度。

3 空間複雜度 1.演算法效率 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很是...

day5時間複雜度

時間複雜度 1 時間頻度乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它...

演算法01 時間複雜度

演算法,通俗來說,就是被設計出來用於解決某個或某類問題,具有一定通用性的計算流程和方法。解決某個問題,通常有不止一種演算法。評價乙個演算法的優劣,從3個方面進行考察 時間複雜度 額外空間複雜度 常數項時間 通常用最壞時間複雜度 大寫o 來表示乙個演算法的時間複雜度。通常估計乙個演算法的時間複雜度是這...