[ 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)平方階
5log2
n\log_2^n
log2n
+20o(lnn
\ln n
lnn)對數階
2n+3nlog2
n\log_2^n
log2n
+19o(nlnn
\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演算法時,會讓我想起三國志這個遊戲,介面是一張中國地圖,諸侯分立,各自為據。但是遊戲開始,玩家會是乙個人一座城池 我比較喜歡這樣,就有挑戰性 然後不斷的征戰各方,占領城池 不斷的擴大地盤...