上一篇文字:http://www.itdecent.cn/p/40133cfcd9e3,筆者和大家分享了“什么是編程語言”。之所以編程是一種語言,和我們平時(shí)說話所用的語言是一樣的,編程語言只是和計(jì)算機(jī)打交道和交流的語言,因?yàn)橛?jì)算機(jī)是一種圖靈裝置,相對(duì)語言的靈活,其實(shí)編程語言是比較死板且簡(jiǎn)單的。
用編程語言寫出來的指令集合其實(shí)就是程序。類似于我們用中文或其他語言(英語,法語等)寫出來的一篇文章,用這篇文章來敘述某些事或表達(dá)某些觀點(diǎn)。大家知道寫文章需要有文章組織結(jié)構(gòu)和寫作方法以更好的表達(dá),當(dāng)然程序也是一樣的。
程序的定義
在編程領(lǐng)域有一個(gè)很經(jīng)典的公式:
程序=數(shù)據(jù)結(jié)構(gòu)+算法
之前已經(jīng)說過,程序是為了解決某些實(shí)際問題而編寫的。然而為了解決問題,就需要使用到某些數(shù)據(jù)結(jié)構(gòu)以及設(shè)計(jì)一個(gè)利用這個(gè)數(shù)據(jù)結(jié)構(gòu)來解決問題的算法。例如:我們?nèi)粘i_車用到的導(dǎo)航功能,用從A點(diǎn)到B點(diǎn),條條大路通羅馬,可以選擇有很多條路,高速優(yōu)先,距離優(yōu)先,時(shí)間優(yōu)先等,如何讓計(jì)算機(jī)幫你規(guī)劃,要解決這個(gè)問題,必定會(huì)使用到圖這種數(shù)據(jù)結(jié)構(gòu), 然而光有數(shù)據(jù)結(jié)構(gòu)還不行,要實(shí)現(xiàn)這個(gè)功能,必須在圖這種數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上,設(shè)計(jì)一種算法,一步一步的操作,這些一步一步的操作就是算法,算法是特定問題求解步驟的描述。
什么是數(shù)據(jù)結(jié)構(gòu)
那么什么是數(shù)據(jù)結(jié)構(gòu)呢?如果要給一個(gè)定義的話(來源于百度百科):
數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運(yùn)行或者存儲(chǔ)效率。數(shù)據(jù)結(jié)構(gòu)往往同高效的檢索算法和索引技術(shù)有關(guān)。
從上面的定義來看數(shù)據(jù)結(jié)構(gòu)需要從3個(gè)方面去理解:
(1)數(shù)據(jù)元素之間的關(guān)系:邏輯結(jié)構(gòu)
(2)數(shù)據(jù)在計(jì)算機(jī)中的存儲(chǔ)方法:物理結(jié)構(gòu)
(3)作用于數(shù)據(jù)結(jié)構(gòu)上的運(yùn)算:算法
這樣說可能比較抽象,我們用數(shù)學(xué)化的語言來表達(dá)。
一般來講數(shù)據(jù)結(jié)構(gòu)按數(shù)據(jù)之間的邏輯關(guān)系分成以下幾種:
- 線性結(jié)構(gòu)
- 集合結(jié)構(gòu)
- 圖結(jié)構(gòu)
-
樹結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)(按邏輯).png
按數(shù)據(jù)在計(jì)算機(jī)的存儲(chǔ)方法即物理結(jié)構(gòu)分成兩種:
- 順序存儲(chǔ)
- 鏈?zhǔn)酱鎯?chǔ)
怎么理解呢?我們還是以上面導(dǎo)航的例子為例,從A點(diǎn)到B點(diǎn),我們需要框定一個(gè)地域范圍,列出這個(gè)范圍內(nèi)所有的交叉點(diǎn)并用某種數(shù)據(jù)結(jié)構(gòu)進(jìn)行表達(dá)。最簡(jiǎn)單的,我們能想到線性表,它是最簡(jiǎn)單、最基本、也是最常用的一種線性結(jié)構(gòu)。 線性表是具有相同數(shù)據(jù)類型的n(n>=0)個(gè)數(shù)據(jù)元素的有限序列,通常記為: (a1,a2,… ai-1,ai,ai+1,…an) ,其中n為表長(zhǎng), n=0 時(shí)稱為空表。 它有兩種存儲(chǔ)方法:順序存儲(chǔ)鏈?zhǔn)酱鎯?chǔ),它的主要基本操作是插入、刪除和檢索等。
常用的數(shù)據(jù)結(jié)構(gòu)包括:
- 數(shù)組
- 堆
- 棧
- 隊(duì)列
- 鏈表
- 樹
- 哈希表
- 圖
什么是算法
算法(Algorithm)是指解題方案的準(zhǔn)確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統(tǒng)的方法描述解決問題的策略機(jī)制。也就是說,能夠?qū)σ欢ㄒ?guī)范的輸入,在有限時(shí)間內(nèi)獲得所要求的輸出。
要看是否是一個(gè)算法,必須滿足下面的這些條件
- 輸入:算法具有0個(gè)或者多個(gè)輸入
- 輸出:至少有1個(gè)或者多個(gè)輸出
- 有窮性:算法在執(zhí)行有限的步驟之后會(huì)自動(dòng)結(jié)束而不會(huì)進(jìn)行死循環(huán)狀態(tài)
- 確定性:算法中的每一步都有意義,不會(huì)出現(xiàn)二義性
- 可行行:算法中每一步都必須可行
看到這些,大家在這里是不是看到很多圖靈機(jī)定義的影子呢?其實(shí)這些都是描述滿足圖靈機(jī)的條件。
既然是算法,算法就有好與壞。那么怎么判斷算法的好壞呢?我們知道做任何事情,我們所擁有的資源是有限的,在這有限的資源內(nèi)怎么把問題解決的更好,就是我們的數(shù)據(jù)結(jié)構(gòu)和算法設(shè)計(jì)時(shí)需要考慮的。
一般來講評(píng)判一個(gè)算法的好壞需要考慮幾個(gè)方面:
1、正確性:
對(duì)于合法輸入能夠得到滿足的結(jié)果,即能正確的解決問題。算法能夠處理非法處理,并得到合理結(jié)果,算法對(duì)于邊界數(shù)據(jù)和壓力數(shù)據(jù)都能得到滿足的結(jié)果
2、可讀性:
算法要方便閱讀,理解和交流,只有自己能看得懂,其它人都看不懂,談和好算法。
3、健壯性:
算法不應(yīng)該產(chǎn)生莫名其妙的結(jié)果,一會(huì)兒正確,一會(huì)兒又是其它結(jié)果
4、高性價(jià)比
利用最少的時(shí)間和資源得到滿足要求的結(jié)果,可以通過(時(shí)間復(fù)雜度和空間復(fù)雜度來判定)
常見的算法如下:
- 遞推法
- 遞歸法
- 窮舉法
- 貪心算法
- 分治法
- 動(dòng)態(tài)規(guī)劃法
- 。。。
