程式=資料結構+演算法
資料結構是相互之間存在的一種或多種特定關係的資料元素的集合。包括4類基本的結構:集合、線形結構、樹形結構、圖狀或網狀結構。通俗點就是資料的邏輯結構,比方說這些資料在記憶體中以什麼樣的結構存放。
演算法實際是程式設計過程中完成一件事採用的方法,比方說現實生活中做數學題時兩個人都將題完成但是他們之間有乙個用的時間很短就是因為採用了簡便的方法。同樣在程式設計過程中採用好的演算法可以降低程式的時空複雜度
什麼是演算法
演算法(algorithm):就是定義良好的計算過程,他取乙個或一組的值為輸入,並產生出乙個或一組值作為輸出。簡單來說演算法就是一系列的計算步驟,用來將輸入資料轉化成輸出結果。
mark:我們可以把所有的演算法想象為一本「菜譜」,特定的演算法比如菜譜中的的一道「老醋花生公尺」的製作流程,只要按照菜譜的要求製作老醋花生公尺,那麼誰都可以做出一道好吃的老醋花生公尺。so,這個做菜的步驟就可以理解為:「解決問題的步驟」
2、演算法的意義
假設計算機無限快,並且計算機儲存容器是免費的,我們還需要各種亂七八糟的演算法嗎?如果計算機無限快,那麼對於某乙個問題來說,任何乙個都可以解決他的正確方法都可以的!
當然,計算機可以做到很快,但是不能做到無限快,儲存也可以很便宜但是不能做到免費。
那麼問題就來了效率:解決同乙個問題的各種不同演算法的效率常常相差非常大,這種效率上的差距的影響往往比硬體和軟體方面的差距還要大。
3、如何選擇演算法
第一首先要保證演算法的正確性
乙個演算法對其每乙個輸入的例項,都能輸出正確的結果並停止,則稱它是正確的,我們說乙個正確的演算法解決了給定的計算問題。不正確的演算法對於某些輸入來說,可能根本不會停止,或者停止時給出的不是預期的結果。然而,與人們對不正確演算法的看法想反,如果這些演算法的錯誤率可以得到控制的話,它們有時候也是有用的。但是一般而言,我們還是僅關注正確的演算法!
第二分析演算法的時間複雜度
演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很好反映出演算法的好壞。
演算法的時間複雜度和空間複雜度
常用的演算法的時間複雜度和空間複雜度
排序法
最差時間分析平均時間複雜度穩定度空間複雜度氣泡排序o(n2)o(n2)穩定o(1)快速排序o(n2)o(n*log2n)不穩定o(log2n)~o(n)選擇排序o(n2)o(n2)穩定o(1)二叉樹排序o(n2)o(n*log2n)不一頂o(n)
插入排序
o(n2)o(n2)穩定o(1)堆排序o(n*log2n)o(n*log2n)不穩定o(1)希爾排序oo不穩定o(1)
1、時間複雜度
(1)時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。
(2)時間複雜度 在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度t(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。 一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。
在各種不同演算法中,若演算法中語句執行次數為乙個常數,則時間複雜度為o(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如t(n)=n2+3n+4與t(n)=4n2+2n+1它們的頻度不同,但時間複雜度相同,都為o(n2)。 按數量級遞增排列,常見的時間複雜度有:常數階o(1),對數階o(log2n),線性階o(n), 線性對數階o(nlog2n),平方階o(n2),立方階o(n3),…, k次方階o(nk),指數階o(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。 2、空間複雜度 與時間複雜度類似,空間複雜度是指演算法在計算機內執行時所需儲存空間的度量。記作: s(n)=o(f(n)) 我們一般所討論的是除正常占用記憶體開銷外的輔助儲存單元規模。討論方法與時間複雜度類似,不再贅述。
(3)漸進時間複雜度評價演算法時間效能 主要用演算法時間複雜度的數量級(即演算法的漸近時間複雜度)評價乙個演算法的時間效能。
2、類似於時間複雜度的討論,乙個演算法的空間複雜度(space complexity)s(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。漸近空間複雜度也常常簡稱為空間複雜度。
空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。乙個演算法在計算機儲存器上所占用的儲存空間,包括儲存演算法本身所占用的儲存空間,演算法的輸入輸出資料所占用的儲存空間和演算法在執行過程中臨時占用的儲存空間這三個方面。演算法的輸入輸出資料所占用的儲存空間是由要解決的問題決定的,是通過參數列由呼叫函式傳遞而來的,它不隨本演算法的不同而改變。儲存演算法本身所占用的儲存空間與演算法書寫的長短成正比,要壓縮這方面的儲存空間,就必須編寫出較短的演算法。演算法在執行過程中臨時占用的儲存空間隨演算法的不同而異,有的演算法只需要占用少量的臨時工作單元,而且不隨問題規模的大小而改變,我們稱這種演算法是「就地\」進行的,是節省儲存的演算法,如這一節介紹過的幾個演算法都是如此;有的演算法需要占用的臨時工作單元數與解決問題的規模n有關,它隨著n的增大而增大,當n較大時,將占用較多的儲存單元,例如將在第九章介紹的快速排序和歸併排序演算法就屬於這種情況。
如當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為0(10g2n);當乙個演算法的空i司複雜度與n成線性比例關係時,可表示為0(n).若形參為陣列,則只需要為它分配乙個儲存由實參傳送來的乙個位址指標的空間,即乙個機器字長空間;若形參為引用方式,則也只需要為其分配儲存乙個位址的空間,用它來儲存對應實參變數的位址,以便由系統自動引用實參變數。
什麼是資料結構和演算法
資料結構定義 我們把現實中大量而複雜的問題以特定的資料型別和特定的儲存結構儲存到主儲存器 記憶體 中,以及在此基礎上為實現某個功能 比如查詢某個元素,刪除某個元素,對所有元素進行排序 而 執行的相應操作,這個相應的操作也叫演算法。資料結構 個體 個體的關係 演算法 對儲存資料的操作 演算法 解題的方...
資料結構 什麼是演算法?
演算法 algorithm 5大特徵 例1 選擇排序演算法的偽碼描述 list到底是陣列還是鍊錶 雖然看上去像是陣列 swap用函式還是用巨集去實現?空間複雜度s n space 執行時占用儲存單元的長度。這個長度往往與輸入的資料的規模有關,過高可能導致記憶體超限,造成程式中斷。時間複雜度t n t...
什麼是資料結構 演算法
一 什麼是資料結構 資料結構 是指相互之間存在著一種或多種特定關係的資料元素的集合。程式 資料結構 演算法 資料的邏輯結構 指反映資料 元素之間的邏輯關係的 資料結構 其中的邏輯關係是指資料元素之間的前後件關係,而與他們在計算機中的儲存位置無關。資料的物理結構 指資料的 邏輯結構 在計算機儲存空間的...