資料結構之時間複雜度和空間複雜度

2021-10-03 23:25:59 字數 1296 閱讀 2414

準備系統性的記錄一下資料結構與演算法的知識點,今天就先從時間複雜度與空間複雜度開始咯~

時間複雜度的定義:在電腦科學中,演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行時間。

乙個演算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程式放在機器上跑起來,才能知道。並且在測試過程中還需要保證裝置一致等條件,時間的衡量才是有效的。但是我們需要每個演算法都上機測試嗎?這樣可以實現,但是很麻煩,所以才有了時間複雜度這個分析方式。

通俗的一句概括:演算法中的基本操作的執行次數,便為演算法的時間複雜度。

大o符號是用於描述函式漸進行為的數學符號,這裡我們用大o()來體現時間複雜度的記法稱之為大o記法。

舉乙個最簡單的例子來描述大o記法是如何運用的:

int n=100;

print("good good study\n");

print("day day up\n");

這裡有三條語句,但是我們通常用常數1取代執行時間中的所有加法常數。這裡的時間複雜度就是o(1)啦~

除了上述這點以外,推導大o階的方法還有:

*在修改後的執行次數函式中,只保留最高端項

*如果最高端項存在且不是1,則去除與這個專案相乘的常數,得到的結果就是大o階

void test1(int n) 

int m = 10;

while (m--)

printf("%d\n", count);

}

這段程式基本操作執行了2n+10次,但是我們通過推導,只保留最高端,並且除去與最高項相乘的數,就得出了時間複雜度為o(n)

const char * strchr ( const char * str, int character );
這段程式也是容易讓人產生困惑的,因為是不定的,基本操作執行最好情況下只1次,最壞要n次。時間複雜度通常看最壞,所以這裡的時間複雜度為也是o(n)

大o記法表示下的時間複雜度還有平方階,對數階等形式,到後面結合資料結構的其他知識再做記錄啦~

演算法的空間複雜度,通過計算演算法所需的儲存空間來實現。但空間複雜度不是程式占用了多少bytes的空間,而算的是變數的個數。大o漸進法這裡同樣適用,記做s(n)=o(f(n)),其中n為問題的規模,f(n)為語句關於n所佔儲存空間的函式。

通常來說演算法不涉及到動態分配的空間以及遞迴、棧所需的空間,空間複雜度為0(1),空間複雜度的特殊例子,也留到後面結合資料結構的其他知識一起記錄啦~

資料結構之時間複雜度和空間複雜度

演算法複雜度分為時間複雜度和空間複雜度,乙個好的演算法應該具體執行時間短,所需空間少的特點。隨著計算機硬體和軟體的提公升,乙個演算法的執行時間是算不太精確的。只能依據統計方法對演算法進行估算。我們拋開硬體和軟體的因素,演算法的好壞直接影響程式的執行時間。我們看一下小例子 int value 0 執行...

資料結構之時間 空間複雜度分析

在很多資料結構的面試題中看似簡單,但是對題目的要求卻挺高,主要就體現在複雜度分析方面。複雜度又分為時間複雜度和空間複雜度。1.時間複雜度 時間複雜度實際就是函式,函式計算執行的基本操作次數 在進行時間複雜度分析時需注意 1 時間複雜度強調的是函式執行的操作次數,這裡的函式是指數學裡面的函式,而不是c...

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

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