DS之演算法概述

2021-06-29 10:52:58 字數 1949 閱讀 3591

演算法

演算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示乙個或多個操作,此外,乙個演算法還具有5個重要的特性。

(1)有窮性    乙個演算法必須總是(對任何合法的輸入值)在執行有窮步之後結束,且每一步都可在有窮時間內(合理的,可接受的時間內)完成。

(2)確定性    演算法中每一條指令必須有確切的含義,讀者理解時不會產生二義性。並且,在任何條件下,演算法只有唯一的一條執行路徑,即對於相同的輸入只能得出相同的輸出。

(3)可行性    乙個演算法是能行的,即演算法中描述的操作都是可以通過已經實現的基本運算執行有限次來實現的。

(4)輸入        乙個演算法有零個或多個的輸入,這些輸入取自某個特定的物件集合。

(5)輸出        乙個演算法有乙個或多個的輸出,這些輸出是同輸入有某些特定關係的量。

演算法設計的要求

(1)正確性    演算法應當滿足具體問題的需求。

(2)可讀性    演算法主要是為了人的閱讀和交流,其次才是機器執行。可讀性有助於人對演算法的理解。

(3)健壯性    當輸入資料非法時,演算法也能適當地做出反應或進行處理,不會產生莫名其妙的輸出結果。

(4)效率與低儲存量需求     通俗地說,效率指的是演算法執行的時間。對於同乙個問題如果有多個演算法可以解決,執行時間短的演算法效率高。儲存量需求指演算法執行過程中所需要的最大儲存空間。效率與低儲存量需求都與問題規模有關。

演算法效率的度量

演算法執行時間需要通過依據該演算法編制的程式在計算機上執行時所消耗的時間來度量。而度量乙個程式的執行時間通常有兩種方法:

(1)事後統計的方法

(2)事前分析估算的方法

乙個用高階程式語言編寫的程式在計算機上執行時所消耗的時間取決於下列因素:

1,依據的演算法選何種策略

2,問題的規模

3,書寫程式的語言,對於同乙個演算法,實現語言的級別越高,執行效率就越低。

4,編譯程式所產生的機器**的質量

5,機器執行指令的速度

乙個演算法是由控制結構(順序,分支和迴圈三種)和原操作(指固有資料型別的操作)構成的,則演算法時間取決於兩者的總和效果。為了便於比較同一問題的不同演算法,通常的做法是,從演算法中選取一種對於所研究的問題(或演算法型別)來說是基本操作的原操作,以該基本操作重複執行的次數作為演算法的時間量度。

演算法的時間複雜度

一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式f(n),演算法的時間量度記作t(n)=o(f(n)),它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸近時間複雜度,簡稱時間複雜度。

顯然,被稱作問題的基本操作的原操作應是其重複執行次數和演算法的執行時間成正比的原操作,多數情況下它是最深層迴圈內的語句中的原操作,它的執行次數和包含它的語句的頻度相同。語句的頻度指的是該語句重複執行的次數。

下面通過幾個例子來說明時間複雜度

1,   「x增1」的語句的頻度為1,則時間複雜度為o(1)常量階

2,for(int i=1; i<=n; i++)     「x增1」的語句的頻度為n,則時間複雜度為o(n)線性階

3,for(int i=1; i<=n; i++) 

for(int j=1;  j<=n;  j++)      「x增1」的語句的頻度為n*n,則時間複雜度為o(n*n)平方階

演算法還可能呈現的時間複雜度有對數階,指數階等。

演算法的儲存空間需求

類似於演算法的時間複雜度,而空間複雜度作為演算法所需要儲存空間的量度,記作s(n)=o(f(n)),其中n為問題的規模(或大小)。乙個上機執行的程式除了需要儲存空間來寄存本身所用指令,常數,變數和輸入資料外,也需要一些對資料進行操作的工作單元和儲存一些為實現計算所需要資訊的輔助空間。若輸入資料所佔空間只取決於問題本身,和演算法無關,則只需要分析除輸入和程式之外的額外空間,否則應同時考慮輸入本身所需要空間(和輸入資料的表示形式有關)。若額外空間相對於輸入資料量來說是常數,則稱此演算法為原地工作。

如果所佔空間量依賴於特定的輸入,則除特定指明外,均按最壞情況來分析。

DS之單鏈表

單鏈表概述 線性表的順序表的優點是隨機訪問表中的任意元素,但是它的缺點也是明顯的,那就是在進行基本操作中的向順序表中插入和刪除資料元素時需要移動大量的元素。因此產生線性表的另一種鏈式儲存結構,也就是單鏈表。它沒有順序表的弱點,但是也失去了順序表的優點。線性表的鏈式儲存結構的特點是用一組任意的儲存單元...

車聯網演算法之概述(一)

2016年,很感謝同學的引領,進入同學公司工作,從此進入了車聯網行業,剛入公司,演算法正好缺人,讓我試試,我從乙個行業門外漢,花了3,5個月時間居然把演算法實現了,而且效果非常好,有趣的是,我居然還做成了大家眼中的演算法 大牛 從此一發不可收拾,2 3年做了7,8個發明專利,全是演算法相關的 駕駛行...

DS 常用排序演算法比較

1.穩定性比較 插入排序 氣泡排序 二叉樹排序 二路歸併排序及其他線形排序是穩定的 選擇排序 希爾排序 快速排序 堆排序是不穩定的 2.時間複雜性比較 插入排序 氣泡排序 選擇排序的時間複雜性為o n2 其它非線形排序的時間複雜性為o nlog2n 線形排序的時間複雜性為o n 3.輔助空間的比較 ...