演算法常識 結構與複雜度

2022-03-02 12:33:31 字數 2681 閱讀 1658

最一些演算法基礎的整理。

很多人提到演算法就會涉及到資料結構。

個人理解之所以有資料結構是因為儲存這個問題。

程式無論是讀取硬碟還是記憶體,涉及到如何讀取,讀取問題呢,相當於找。那麼如何能夠快速的找到?關鍵在於當時我們怎麼放,如何存放就是資料結構。

常見的資料結構:線,樹,圖。

個人理解,線是一維概念,圖和樹都是二維概念,當然還有三維概念,暫時不理解。

什麼是演算法?1+1等於2,算不算?

個人理解,算。實際上1+1等於2,並不簡單,具體可參考計算機是如何計算的,而這個演算法奠定了計算機基礎。

符合下面的就屬於演算法:

乙個演算法應該具有以下五個重要的特徵:

有窮性(finiteness)

演算法的有窮性是指演算法必須能在執行有限個步驟之後終止;

確切性(definiteness)

演算法的每一步驟必須有確切的定義;

輸入項(input)

乙個演算法有0個或多個輸入,以刻畫運算物件的初始情況,所謂0個輸入是指演算法本身定出了初始條件;

輸出項(output)

乙個演算法有乙個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的;

可行性(effectiveness)

演算法中執行的任何計算步驟都是可以被分解為基本的可執行的操作步驟,即每個計算步驟都可以在有限時間內完成(也稱之為有效性)。

很多時候都聽說過空間換時間,時間換空間,兩者在最優的情況下是不可相容的,在現在硬體的發展下,很多都選擇空間換時間。

什麼是時間複雜度?

時間複雜度計算有多種,其中一種為漸進時間複雜度。

因為電腦其實沒有時間這個概念,即使是我們的電腦裡面設定時間,也是通過無數次的無意義循序形成的,所以計算機中計算時間的就是執行的次數。

t(n)=100n; t(n)=5(n^2)

到底哪個最快?根據上述得到的結果為n。

漸進時間複雜度的概念:若存在函式f(n),t(n)/f(n)的極限值為不等於0的常數,則稱f(n)是t(n)的同級函式。記作t(n)=o(f(n))0,o為演算法的漸進時間的複雜度,簡稱時間複雜度。

這個是什麼意思?

1.如果執行時間是常亮級則為1

2.只保留函式最高端

3.如果最高端項存在,則省去最高端前面的係數。

說了這麼多什麼意思呢?

比如說 5n^2+2n+6

就是把常亮為1:n^2 +n +1

保留最高端:n^2

這就是時間複雜度了。

舉例:執行次數為線性:n

public void test1(int n)

}

對數:log(n)

int sum = 0;

for (int i = n; i > 1; i /= 2)

常數1:

console.writeline("do the timer:"+(++sum));
0.5n^2+0.5 根據前面的原則,為n^2

for (int i = 0; i < n; i++)

}

空間複雜度:

時間複雜度可以通過執行次數計算,那麼空間呢?

空間計算沒有我們想象的那麼簡單,因為在執行輸入的時候我們需要向系統申請空間,比如for 迴圈的i。

空間複雜度:對乙個演算法都在執行過程中臨時用到的空間。

比如說:

我們在比較大小的時候會用到temp,那麼複雜度就為0(1)

void space1()

線性空間:o(n)

void space1(n)

我們計算矩陣的時候用到的:

n^2

void space1(n)

4.遞迴空間

遞迴空間就是乙個特殊的例子:

void space2(int n)

space2(n);

}

這時候n就是臨時變數,這裡面n的次數就為n,所以為o(n)

如果是:

void space2(int n)

space2(n/2);

}

那麼就是o(n)=log(n)。

也就是說也需要計算n的臨時變數次數。

舉個空間換時間的方法:

下面例子來自漫畫演算法這本書:

上述就是題目了,最簡單的方式就是從3開始,然後遍歷後面的,然後1,遍歷後面的。

根據輸入的個數,複雜度為:0.5n2+0.5n,時間複雜度為o(n2)

那麼如何加乙個字典來記錄:

如果為0,那麼就設定為1,如果為1就說明以前存在,那麼就跳出。

因為只遍歷一遍,查詢字典的時間複雜度為o(1),所以時間複雜度為o(n),空間複雜度也為o(n)。

其實這就很假了,因為建立乙個字典本身需要花費時間,人類無法計算出全部的計算,所以只能設定為n在極限情況下,具體還要看程式本身,需要經過測試,經驗。

資料結構與演算法 時間複雜度與空間複雜度

解決乙個問題的方法可能有很多,但能稱得上演算法的,首先它必須能徹底解決這個問題 稱為準確性 且根據其編寫出的程式在任何情況下都不能崩潰 稱為健壯性 程式和演算法是完全不同的概念。演算法是解決某個問題的想法 思路 而程式是在根據演算法編寫出來的真正可以執行的 例如,要依次輸出一維陣列中的資料元素的值,...

演算法的複雜度 時間複雜度與空間複雜度

通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...

資料結構與演算法 時間複雜度和空間複雜度

一 階數比較 時間複雜度判斷理論 o 1 o log2 n o n o n log2 n o n 2 o n k o 2 n 二 計算方法 用常數1代替執行時間中的所有加法常數 修改後的執行次數中只保留最高端項 去除最高端項的係數 三 常見的求時間複雜度例子 1 常數階 int a 1 int b ...