時間複雜度和空間複雜度

2022-06-17 10:12:13 字數 3139 閱讀 4609

1.概念:

同一問題,不同的演算法來解決,為了提供程式效率,會從時間複雜度和空間複雜度分析

2.時間複雜度

1)時間頻率

演算法的語句執行的次數稱為語句頻度或者時間頻度,記為t(n),n稱為問題的規模。

2)時間複雜度(演算法的時間複雜度是指執行演算法所需要的計算工作量。)

知識點:

(a)一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),存在乙個正常數c使得fn*c>=t(n)恆成立。記作t(n)=o(f(n)),稱o(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。

(b)在各種不同演算法中,若演算法中語句執行次數為乙個常數,則時間複雜度為o(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如t(n)=n^2+3n+4與t(n)=4n^2+2n+1它們的頻度不同,但時間複雜度相同,都為o(n^2)。

3) 按數量級遞增排列,常見的時間複雜度

(a)常數階o(1),對數階o(log2n)(以2為底n的對數,下同),線性階o(n),

(b)  線性對數階o(nlog2n),平方階o(n^2),立方階o(n^3),...,

(c)  k次方階o(n^k),指數階o(2^n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。

上面的了解了,你基本就知道了時間複雜度的基本概率,下面可以選擇性了解

演算法的時間效能分析

(1)演算法耗費的時間和語句頻度

乙個演算法所耗費的時間=演算法中每條語句的執行時間之和

每條語句的執行時間=語句的執行次數(即頻度(frequency count))×語句執行一次所需時間

演算法轉換為程式後,每條語句執行一次所需的時間取決於機器的指令性能、速度以及編譯所產生的**質量等難以確定的因素。

若要獨立於機器的軟、硬體系統來分析演算法的時間耗費,則設每條語句執行一次所需的時間均是單位時間,乙個演算法的時間耗費就是該演算法中所有語句的頻度之和。

求兩個n階方陣的乘積 c=a×b,其演算法如下:

該演算法中所有語句的頻度之和(即演算法的時間耗費)為:

t(n)=2n3+3n2+2n+1

分析:語句(1)的迴圈控制變數i要增加到n,測試到i=n成立才會終止。故它的頻度是n+1。但是它的迴圈體卻只能執行n次。語句(2)作為語句(1)迴圈體內的語句應該執行n次,但語句(2)本身要執行n+1次,所以語句(2)的頻度是n(n+1)。同理可得語句(3),(4)和(5)的頻度分別是n2,n2(n+1)和n3。

演算法matrixmultiply的時間耗費t(n)是矩陣階數n的函式。

(2)問題規模和演算法的時間複雜度

演算法求解問題的輸入量稱為問題的規模(size),一般用乙個整數表示。

矩陣乘積問題的規模是矩陣的階數。

乙個圖論問題的規模則是圖中的頂點數或邊數。

乙個演算法的時間複雜度(time complexity, 也稱時間複雜性)t(n)是該演算法的時間耗費,是該演算法所求解問題規模n的函式。當問題的規模n趨向無窮大時,時間複雜度t(n)的數量級(階)稱為演算法的漸進時間複雜度。

演算法matrixmultiply的時間複雜度t(n)如(1.1)式所示,當n趨向無窮大時,顯然有t(n)~o(n^3);

這表明,當n充分大時,t(n)和n^3之比是乙個不等於零的常數。即t(n)和n^3是同階的,或者說t(n)和n^3的數量級相同。記作t(n)=o(n^3)是演算法matrixmultiply的漸近時間複雜度。

(3)漸進時間複雜度評價演算法時間效能

主要用演算法時間複雜度的數量級(即演算法的漸近時間複雜度)評價乙個演算法的時間效能。

演算法matrixmultiply的時間複雜度一般為t(n)=o(n^3),f(n)=n^3是該演算法中語句(5)的頻度。下面再舉例說明如何求演算法的時間複雜度。

交換i和j的內容。

temp=i;

i=j;

j=temp;

以上三條單個語句的頻度均為1,該程式段的執行時間是乙個與問題規模n無關的常數。演算法的時間複雜度為常數階,記作t(n)=o(1)。

注意:如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數。此類演算法的時間複雜度是o(1)。

變數計數之一:

(1) x=0;y=0;

(2) for(k=1;k<=n;k++)

(3) x++;

(4) for(i=1;i<=n;i++)

(5) for(j=1;j<=n;j++)

(6) y++;

一般情況下,對步進迴圈語句只需考慮迴圈體中語句的執行次數,忽略該語句中步長加1、終值判別、控制轉移等成分。因此,以上程式段中頻度最大的語句是(6),其頻度為f(n)=n^2,所以該程式段的時間複雜度為t(n)=o(n^2)。

當有若干個迴圈語句時,演算法的時間複雜度是由巢狀層數最多的迴圈語句中最內層語句的頻度f(n)決定的。

變數計數之二:

(1) x=1;

(2) for(i=1;i<=n;i++)

(3) for(j=1;j<=i;j++)

(4) for(k=1;k<=j;k++)

(5) x++;

該程式段中頻度最大的語句是(5),內迴圈的執行次數雖然與問題規模n沒有直接關係,但是卻與外層迴圈的變數取值有關,而最外層迴圈的次數直接與n有關,因此可以從內層迴圈向外層分析語句(5)的執行次數:

則該程式段的時間複雜度為t(n)=o(n^3/6+低次項)=o(n^3)。

(4)演算法的時間複雜度不僅僅依賴於問題的規模,還與輸入例項的初始狀態有關。

在數值a[0..n-1]中查詢給定值k的演算法大致如下:

(1)i=n-1;

(2)while(i>=0&&(a[i]!=k))

(3) i--;

(4)return i;

此演算法中的語句(3)的頻度不僅與問題規模n有關,還與輸入例項中a的各元素取值及k的取值有關:

①若a中沒有與k相等的元素,則語句(3)的頻度f(n)=n;

②若a的最後乙個元素等於k,則語句(3)的頻度f(n)是常數0。

空間複雜度:

與時間複雜度類似,空間複雜度是指演算法在計算機內執行時所需儲存空間的度量。記作:

s(n)=o(f(n))

演算法執行期間所需要的儲存空間包括3個部分:

在許多實際問題中,為了減少演算法所佔的儲存空間,通常採用壓縮儲存技術。

參考:

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

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

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

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

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

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...