時間複雜度 空間複雜度

2021-10-06 16:21:53 字數 1851 閱讀 1493

演算法:指用來運算元據,解決程式問題的一組方法。對於同乙個問題,使用不同的演算法,也許最終的結果是一樣的,但是在整個過程中消耗的資源和時間往往會因為演算法的不同而存在比較大的差異。

那麼我們怎麼來衡量解決同樣問題的不同演算法的優劣呢?

答:主要還是兩個方面,乙個是演算法占用的時間,另乙個是演算法占用的空間,借助這兩個維度來考量演算法。

時間維度:是指執行當前演算法所消耗的時間,通常是用【時間複雜度】來描述

空間維度:指執行當前演算法需要占用多少記憶體空間,通常是用【空間複雜度】來描述

大o表示法

常見的時間複雜度量級

首先依次舉例來說明這些不同階的時間複雜度。

o(1)

無論**執行了多少行,其他區域不會影響到操作,這個**的時間複雜度都是o(1)

o(n)

下面這段**,for迴圈裡面的**會執行n遍,因此它消耗的時間隨著n的變化而變化的,因此可以使用o(n)來表示時間複雜度

int sum (

int n )

6return ret;

7}

o(n²)

當存在雙重迴圈的時候,即把o(n)的**再巢狀迴圈一遍,它的時間複雜度就是o(n²)

1

void

selectionsort

(int arr,

int n)

10}

當然並不是所有的雙重迴圈都是 o(n²),比如下面這段輸出 30n 次 hello,五分鐘學演算法:)的**。

1

void printinformation (

int n )

o(logn)

1

intbinarysearch

(int arr,

int n ,

int target)

9return-1

;10}

在二分查詢法的**中,通過while迴圈,成2倍數的縮減搜尋範圍,也就是說經過log2^n 次即可跳出迴圈。

o(nlogn)

將時間複雜度為o(logn)的**迴圈n遍的話,那麼它的時間複雜度就是n* o(logn),也就是o(nlogn)。

1

void hello ()7

}8}

不常見的時間複雜度量級乙個程式的空間複雜度是指執行完乙個程式所需記憶體的大小。利用程式的空間複雜度,可以對程式的執行所需要的記憶體多少有個預先估計。乙個程式執行時除了需要儲存空間和儲存本身所使用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的工作單元和儲存一些為現實計算所需資訊的輔助空間。程式執行時所需儲存空間包括以下兩部分:

(1) 固定部分,這部分空間的大小與輸入/輸出的資料的個數多少、數值無關。主要包括指令空間(即**空間)、資料空間(常量、簡單變數)等所佔的空間。這部分屬於靜態空間。

(2) 可變空間,這部分空間的主要包括動態分配的空間,以及遞迴棧所需的空間等。這部分的空間大小與演算法有關。

乙個演算法所需的儲存空間用f(n)表示。s(n)=o(f(n)),其中n為問題的規模,s(n)表示空間複雜度。

空間複雜度可以理解為除了原始序列大小的記憶體,在演算法過程中用到的額外的儲存空間。

空間複雜度是乙個演算法在執行過程中臨時占用儲存空間大小的量度。

通常來說,只要演算法不涉及到動態分配的空間,以及遞迴,棧所需的空間,空間複雜度通常為o(1)

本文幾乎全部學習該部落格

時間複雜度 空間複雜度

時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...

時間複雜度 空間複雜度

演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...

時間複雜度 空間複雜度

一 時間複雜度 實際是指程式執行次數,而不是程式執行時間 1.我們一般討論的是最壞時間複雜度,這樣做的原因是 最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上限,以最壞代表最全。2.時間複雜度的書寫規則 忽略常數項,用o 1 表示 選取最壞時間複雜度即選取增長最快的項 遞迴的時間複雜度 遞...