小白眼裡的演算法

2021-10-07 19:33:50 字數 2470 閱讀 3412

[ 2023年7月6號]

繼昨天提到的什麼是資料結構之後,今天我們一起學習的是第二章的內容:什麼是演算法?還是希望大家能給我一下意見和建議在提公升部落格質量方面上。

二.什麼是演算法

1. 基本概念

我第一次接觸程式設計的時候,總是聽一些大佬提起用什麼什麼演算法來解決這個問題更好一些,當時覺得演算法就是一種高逼格的東西。其實不然,你寫的每個程式其實大體上都可以稱作是演算法。

演算法在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。

但是同樣都是演算法,肯定就會有好壞之分。我們用下面這個題目來舉個例子:寫乙個程式求1+2+3+…+100的和。

剛學程式設計的人會大概率會這麼寫:

int sum =0;

//執行了一次

for(

int i =

0;i <

100;i++

)//執行了n+1次

std::cout

當然有些小夥伴可能看出這其實是個等差數列,那麼我們就可以利用等差數列的性質來求解:

int sum =

0,n =

100;

//執行了一次

sum =(1

+ n)

* n /2;

//執行了一次

std::cout

由上述**我們可以看出兩種解決方案的執行效率,方案a執行了2n+3次,方案b只執行了3次,顯而易見演算法b來的更加有效。

2. 演算法特性

演算法具有基本的五個基本特性:

2. 演算法的設計要求

3. 演算法時間複雜度

我們通常將演算法的時間複雜度記為:

其中t(n)是語句總的執行次數,f(n)是問題規模n的某個函式,整個式子表示隨著問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同。

以下例舉一些常見的時間複雜度

執行次數函式

value

非正式術語

12o(1)

常數階2n+3

o(n)

線性階3n^2+2n+1

o(n

2n^2

n2)平方階

5log⁡2

n\log_2^n

log2n​

+20o(ln⁡n

\ln n

lnn)對數階

2n+3nlog⁡2

n\log_2^n

log2n​

+19o(nln⁡n

\ln n

lnn)nlogn階

6 n3

6n^3

6n3 +2n

2n^2

n2+3n+4

o(n

3n^3

n3)立方階

2

n2^n

2no(2

n2^n

2n)指數階

常用的時間複雜度所耗費的時間從小打到依次是:

o(1) < o(logn) < o(n) < o(nlogn) < o(n^2) < o(n^3) < o(2^n) < o(n!) < o(n^n)

由上面的一些常用的時間複雜度,其實我們差不多可以看出規律在哪了:判斷乙個演算法的時間效率時,函式中的常數和其他次要項常常可以忽略,更應該關注最高端項(最高端項的係數也可以忽略!),而對於常數階,不論多大,在計算演算法時間複雜度的時候均看成1就可以了。

但是生活總是會給我們不斷地製造驚喜,就好比對於一些演算法,情況往往總是在不斷變化的。就那排序演算法來舉例子,給你乙個打亂的序列,要求排序成乙個從大到小有序序列,那麼這樣的演算法時間複雜度又又應該如何計算呢?

4. 演算法時間複雜度的最壞情況和最好情況

除非特別指定,否則我們提到的執行時間都是指最壞的情況下所執行的時間。

就拿剛才的排序演算法來比較,我們用大家最熟悉的氣泡排序演算法來做例子,給定乙個序列,要求排列成從小到大的有序序列。那麼最好的情況下就是這個序列本身就是個從小到大的有序序列,那麼

時間複雜度為0(1)

,那麼最壞的情況下就是這個序列是從大到小排序的,那麼

時間複雜度為0(n

2n^2

n2)。5. 演算法空間複雜度

演算法的空間複雜度是通過演算法所需的儲存空間實現,

注意若輸入資料所佔空間只取決於問題本身,和演算法無關,這樣只需要分析該演算法在實現時所需要的輔助單元即可。若演算法執行時所需要的輔助空間相對於輸入資料量而言是個常數,則稱此演算法為原地工作,空間複雜度為0(1)。

舉個簡單的例子,就拿氣泡排序來說,氣泡排序本身就是在原有的空間中運作,並不需要額外的空間來實現演算法,所以氣泡排序的空間複雜度為0(1)。

小白眼裡的迴圈

一般形式 switch 整形表示式 break與default的使用 沒有寫break則會直接跳轉至下乙個case或語句 default用於情況都不存在時 includeint main void 改進後 includeint main void 模型 while 條件 continue用於結束本次...

小白眼中的C 結構體

沒辦法老提示我名字重複率太高 如果學過c的結構體,c 的看著還其實還好,如果沒學過的話,請先看一下下面的內容 struct name a 建立了乙個叫a的結構體儲存個人資訊 cin a.age 輸入這個人的年齡,名稱加 可以選擇某一項內容。成員更加標準一點,這樣 運算子又叫做成員運算子。而初始化的話...

我眼裡K Means演算法

在我眼裡一切都是那麼簡單,複雜的我也看不懂,最討厭那些複雜的人際關係,唉,像孩子一樣交流不好嗎。學習k means演算法時,會讓我想起三國志這個遊戲,介面是一張中國地圖,諸侯分立,各自為據。但是遊戲開始,玩家會是乙個人一座城池 我比較喜歡這樣,就有挑戰性 然後不斷的征戰各方,占領城池 不斷的擴大地盤...