演算法分析之 時間複雜度

2021-10-02 11:31:41 字數 2177 閱讀 6420

當電腦執行下面這段**的時候,執行任何一條語句都需要花費時間(為了方便討論,這裡我們把每一條語句的執行時間都看做是一樣的,記為乙個時間單元)

這個程式有這麼幾個地方消耗了時間

① 藍色框的兩條語句,花費2個時間單元

② 黑色框的一條語句,花費n+1個時間單元

③ 紅色框的兩條語句,花費2*n個時間單元

那麼一共花費了3n+3個時間單元,可以看出,程式消耗的時間和n成線性關係

我們常常會對這個函式進行簡化,使得它既簡單又不失函式的主要特性

所以一般只關心隨著問題規模n趨於無窮時函式中對函式結果影響最大的項,也就是最高次項

舉個栗子:

至於判斷哪個是高階項,哪個是低階項,只需記住下面的大小關係就行了,到時按照這個進行忽略(忽略相對較小的)

簡化後的式子被稱為這個程式演算法的時間複雜度,記做o(f(n)),f(n)就是簡化後的式子,比如說剛開始討論的t(n)=3n+3,簡化後t(n)~f(n)=n,那我們記為o(n)

時間複雜度可以表示某個演算法的執行時間的趨勢,大致地度量演算法效率的好壞

一、得出執行時間的函式

二、對函式進行簡化

常數1取代執行時間中所有加法常數

修改後的函式中,只保留最高端項

如果最高端項存在且係數不為1,則忽略這個項的係數(即令其係數為1

舉個栗子:

int n =0;

n = n +6;

printf

(n);

t(n)=3(三條語句1+1+1),對這個函式進行簡化,用常數1取代常數3,然後取代後的函式沒有最高端項,那麼這個演算法的時間複雜度就是o(1).

o(1)也被稱為常數階

如果每次都要把時間函式算出來,挺麻煩的,可以耍耍小聰明,一般來說,最內層執行次數最多的語句就決定了整個演算法的趨勢

for

(int i =

0; i < n; i++

)printf

("哈"

);

這個內層列印語句需要迴圈n次,隨著問題規模n的增加會呈線性增加,可以判定其時間複雜度為o(n)按照這個方法就很容易得出下面這個巢狀的兩層for迴圈的時間複雜度為o(n2)

for

(int i =

0; i < n; i++

)}

有乙個很神奇的函式——對數函式,它隨著自變數的增大,因變數增長的很慢

下面這段**的複雜度就為對數級別o(logn)

int sum =1;

while

(sum < n)

和之前的分析方法一樣,我們著重看執行次數最多的內層**語句

sum = sum *

2;

每迴圈一次,sum就給自身乘以2,乘了多少次就跳出迴圈了呢(大於等於n)?不知道,就設為x吧,那麼 2x=n,解出 x=log2

n,這說明隨著n的增大,最消耗時間的內層語句是呈對數變化的。

感謝閱讀~

演算法之時間複雜度

前言 學習這東西,很枯燥也很煩,參考許多博文,選了許多。結合一些東西,記錄一下,也是為了以後回顧學習。演算法效率 說到演算法效率 不得不提兩個指標,那就是 時間複雜度 空間複雜度 好的演算法應該具備時間效率高和儲存量低的特點。計算機能快速完成大量複雜的資料處理,但是要完成這個工作,計算機也是需要一定...

演算法之 時間複雜度和空間複雜度

平時用的少,經常忘記,這裡記錄下時間複雜度的概念 複雜度是演算法的一種標記方法。用o表示,通常讀為big o o的包含了時間複雜和空間複雜度 這裡就只說時間複雜度。時間複雜度的概念,個人總結,可能不太準確。時間複雜度,即標記乙個問題,隨著問題規模的變化,所需要花費時間的關係。時間複雜度就是問題規模和...

演算法之時間複雜度簡析

最近準備對演算法進行一些系統的總結和學習,不積跬步無以至千里,不積小流無以成江海.此文主要對時間複雜度進行簡單梳理和個人總結,本人才疏學淺,有所疏漏在所難免,如有不當和錯誤之處,歡迎指正 時間複雜度,用簡單地話描述為 為了大概估算程式運算時間的一種概量。那用什麼來估算的呢?用簡單的程式執行 的次數,...