数据结构和算法教程
目錄
1.1數(shù)據(jù)結(jié)構(gòu)的研究內(nèi)容
1.2基本概念和術(shù)語
1.2.1數(shù)據(jù),數(shù)據(jù)元素,數(shù)據(jù)項(xiàng),數(shù)據(jù)對象
1.2.2數(shù)據(jù)結(jié)構(gòu)(Data Structure)
1.2.3數(shù)據(jù)類型和抽象數(shù)據(jù)類型
1.3抽象數(shù)據(jù)類型的表示與實(shí)現(xiàn)
1.4算法和算法分析
算法時(shí)間復(fù)雜度的漸進(jìn)表示法
漸進(jìn)空間復(fù)雜度
1.1數(shù)據(jù)結(jié)構(gòu)的研究內(nèi)容
????????通常,用計(jì)算機(jī)解決一個(gè)問題的步驟:具體問題抽象為數(shù)學(xué)模型(實(shí)質(zhì)):分析問題;提取操作對象,找出操作對象之間的關(guān)系;用數(shù)學(xué)語言描述-》稱為數(shù)據(jù)結(jié)構(gòu)。設(shè)計(jì)算法。編程,調(diào)試,運(yùn)行。
????????早期,計(jì)算機(jī)主要用于數(shù)值計(jì)算。隨著計(jì)算機(jī)應(yīng)用領(lǐng)域的擴(kuò)展,計(jì)算機(jī)被越來越多地用于非數(shù)值計(jì)算。
例如1 學(xué)生學(xué)籍管理系統(tǒng)
?操作對象:每位學(xué)生的信息(學(xué)號(hào),姓名,性別,籍貫,專業(yè)....)
操作算法:查詢,插入,修改,刪除等。
操作對象之間的關(guān)系:線性關(guān)系? ? ? ? 數(shù)據(jù)結(jié)構(gòu):線性數(shù)據(jù)結(jié)構(gòu),線性表。
類似的還有圖書管理系統(tǒng),人事管理系統(tǒng),倉庫管理系統(tǒng),通訊錄
操作對象:若干行數(shù)據(jù)記錄
操作算法:查詢,插入,修改,刪除等
操作對象之間的關(guān)系:線性表
數(shù)據(jù)結(jié)構(gòu):線性數(shù)據(jù)結(jié)構(gòu)
?例如2? ? ? ? 人際對弈問題
人輸入棋子:計(jì)算機(jī)進(jìn)行運(yùn)算推算出機(jī)器人下一步的棋局。之所以能對弈:策略已經(jīng)輸入計(jì)算機(jī),可以根據(jù)當(dāng)前棋局來預(yù)測棋局的發(fā)展趨勢,甚至最后結(jié)果
計(jì)算機(jī)的操作對象:各種棋局狀態(tài),即描述棋盤的格局信息
計(jì)算機(jī)的算法:走棋,即選擇一種策略使棋局狀態(tài)發(fā)生變化(由一個(gè)格局派生出另一個(gè)格局)
- ?文件系統(tǒng)的系統(tǒng)結(jié)構(gòu)圖
磁盤根目錄下有很多子目錄及文件,每個(gè)子目錄里又可以包含子目錄及文件,但每個(gè)子目錄只有一個(gè)父目錄,依次類推
?綜上所述
- 這些問題的共性都是無法用數(shù)學(xué)的公式或方程來描述,是一些“非數(shù)值計(jì)算”的程序設(shè)計(jì)問題
- 描述非數(shù)值計(jì)算問題的數(shù)學(xué)類型不是數(shù)學(xué)方程,而是諸如表,樹和圖之類的具有邏輯關(guān)系的數(shù)據(jù)
- 數(shù)據(jù)結(jié)構(gòu)是一門研究非數(shù)值計(jì)算的程序設(shè)計(jì)中計(jì)算機(jī)的操作對象以及,他們之間的關(guān)系和操作的學(xué)科
1.2基本概念和術(shù)語
1.2.1數(shù)據(jù),數(shù)據(jù)元素,數(shù)據(jù)項(xiàng),數(shù)據(jù)對象
數(shù)據(jù)(data)? ? ? ? 數(shù)據(jù)元素(data element)? ? ?
數(shù)據(jù)項(xiàng)(data item)? ? ? ? 數(shù)據(jù)對象(data object)
?1.數(shù)據(jù)(Data)
- ? ? ? ? 是能夠輸入計(jì)算機(jī)且能被計(jì)算機(jī)處理的各種符號(hào)的集合
- 信息的載體
- 是對客觀事物符號(hào)化的表示
- 能夠被計(jì)算機(jī)識(shí)別,存儲(chǔ)加工
- 包括:
- 數(shù)值型的數(shù)據(jù):整數(shù),實(shí)數(shù)等;
- 非數(shù)值型的數(shù)據(jù):文字,圖像,圖形,聲音等
2.數(shù)據(jù)元素(Data Element)
- 數(shù)據(jù)元素
- 是數(shù)據(jù)的基本單位,在計(jì)算機(jī)程序中通常作為一個(gè)整體進(jìn)行考慮和處理
- 也簡稱為元素,或稱為記錄,結(jié)點(diǎn)或頂點(diǎn)。
- 一個(gè)數(shù)據(jù)元素可由若干個(gè)數(shù)據(jù)項(xiàng)組成(Data Item)
3.數(shù)據(jù)項(xiàng)
- 數(shù)據(jù)項(xiàng)
- 構(gòu)成數(shù)據(jù)元素的不可分割的最小單位
- 數(shù)據(jù),數(shù)據(jù)元素,數(shù)據(jù)項(xiàng)三者之間的關(guān)系:
- 數(shù)據(jù)>數(shù)據(jù)元素>數(shù)據(jù)項(xiàng)
- 例如:學(xué)生表>個(gè)人記錄>學(xué)號(hào),姓名.....
- 數(shù)據(jù)>數(shù)據(jù)元素>數(shù)據(jù)項(xiàng)
4.數(shù)據(jù)對象
- 數(shù)據(jù)對象
- 是性質(zhì)相同是數(shù)據(jù)元素的集合,十?dāng)?shù)據(jù)的一個(gè)子集
- 例如:
- 整數(shù)數(shù)據(jù)對象是集合N={0,1,2,3.....};
- 字母字符數(shù)據(jù)對象是集合C={‘A’,'B',.....'Z'}
- 學(xué)籍表也可以看做一個(gè)數(shù)據(jù)對象
- 數(shù)據(jù)元素-----組成數(shù)據(jù)的基本單位
- 與數(shù)據(jù)的關(guān)系:是集合的個(gè)體
- 數(shù)據(jù)對象----性質(zhì)相同的數(shù)據(jù)元素的集合
- 與數(shù)據(jù)的關(guān)系是:集合的子集
1.2.2數(shù)據(jù)結(jié)構(gòu)(Data Structure)
- 數(shù)據(jù)結(jié)構(gòu)
- 數(shù)據(jù)元素不是孤立存在的,他們之間存在著某種關(guān)系,數(shù)據(jù)元素相互之間的關(guān)系稱為結(jié)構(gòu)(Structure)
- 是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合
- 或者說,數(shù)據(jù)結(jié)構(gòu)是帶結(jié)構(gòu)的數(shù)據(jù)元素的集合
- 數(shù)據(jù)結(jié)構(gòu)包括以下三個(gè)方面的內(nèi)容
- 邏輯結(jié)構(gòu)
- 描述數(shù)據(jù)元素之間的邏輯關(guān)系
- 與數(shù)據(jù)的存儲(chǔ)無關(guān),獨(dú)立于計(jì)算機(jī)
- 是從具體問題抽象出來的數(shù)學(xué)模型
- 物理結(jié)構(gòu)(存儲(chǔ)結(jié)構(gòu))
- 數(shù)據(jù)元素及其關(guān)系在計(jì)算機(jī)存儲(chǔ)器中的結(jié)構(gòu)(存儲(chǔ)方式)
- 是數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)中的表示
- 邏輯結(jié)構(gòu)與存儲(chǔ)結(jié)構(gòu)的關(guān)系:
- 存儲(chǔ)結(jié)構(gòu)是邏輯結(jié)構(gòu)的映像與元素本身的映象
- 邏輯結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)的抽象,存儲(chǔ)結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)
- 兩者綜合起來建立了數(shù)據(jù)元素之間的結(jié)構(gòu)關(guān)系
- 邏輯結(jié)構(gòu)的種類
- 劃分方法一
- (1)線性結(jié)構(gòu):有且僅有一個(gè)開始和終端結(jié)點(diǎn),并且所有結(jié)點(diǎn)都最多只有一個(gè)直接前趨和一個(gè)直接后繼
- 例如:線性表,棧,隊(duì)列,串
- (2)非線性結(jié)構(gòu):一個(gè)結(jié)點(diǎn)可能有多個(gè)直接前趨和直接后繼
- 例如:樹,圖
- 劃分方法二——四類基本邏輯結(jié)構(gòu)
- (1)集合結(jié)構(gòu):結(jié)構(gòu)中數(shù)據(jù)元素之間除了同屬于一個(gè)集合的關(guān)系外,無任何其他關(guān)系
- (2)線性結(jié)構(gòu):結(jié)構(gòu)中數(shù)據(jù)元素之間存在著一對一的線性關(guān)系
- (3)樹形結(jié)構(gòu):結(jié)構(gòu)中數(shù)據(jù)元素之間存在著一對多的層次關(guān)系
- (4)圖狀結(jié)構(gòu)或網(wǎng)狀結(jié)構(gòu):結(jié)構(gòu)中的數(shù)據(jù)元素之間存在著多對多的任意關(guān)系
- 四種基本的存儲(chǔ)結(jié)構(gòu)
- 順序存儲(chǔ)結(jié)構(gòu)
- 用一組連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素,數(shù)據(jù)元素之間的邏輯關(guān)系由元素的存儲(chǔ)位置來表示
- C語言中用數(shù)組實(shí)現(xiàn)順序存儲(chǔ)結(jié)構(gòu)
- 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
- 用一組任意的存儲(chǔ)單元存儲(chǔ)數(shù)據(jù)元素,數(shù)據(jù)元素之間的邏輯關(guān)系用指針來表示
- C語言中用指針(地址)來實(shí)現(xiàn)鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
- 索引存儲(chǔ)結(jié)構(gòu)
- 在存儲(chǔ)結(jié)點(diǎn)信息的同時(shí),還建立附加的索引表
- 索引表中的每一項(xiàng)稱為一個(gè)索引項(xiàng)
- 索引項(xiàng)的一般形式是(關(guān)鍵字,地址)
- 關(guān)鍵字是能唯一標(biāo)識(shí)一個(gè)結(jié)點(diǎn)的那些數(shù)據(jù)項(xiàng)
- 若每個(gè)結(jié)點(diǎn)在索引表中都有一個(gè)索引項(xiàng),則該索引表稱之為稠密索引(Dense Index)若一組結(jié)點(diǎn)在索引表中只對應(yīng)一個(gè)索引項(xiàng),則該索引表稱為稀疏索引(Sparse Index)
- 散列存儲(chǔ)結(jié)構(gòu)
- 根據(jù)結(jié)點(diǎn)的關(guān)鍵字直接計(jì)算出該結(jié)點(diǎn)的存儲(chǔ)地址
- 順序存儲(chǔ)結(jié)構(gòu)
1.2.3數(shù)據(jù)類型和抽象數(shù)據(jù)類型
- 在使用高級程序設(shè)計(jì)語言編寫程序時(shí),必須對程序中出現(xiàn)的每個(gè)變量,常量或表達(dá)式,明確說明它們所屬的數(shù)據(jù)類型
- 例如:C語言中:
- 提供int,char,float,double等基本數(shù)據(jù)類型
- 數(shù)組,結(jié)構(gòu),共用體,枚舉等構(gòu)造數(shù)據(jù)類型
- 還有指針,空(void)類型
- 用戶也可以用typedef 自己定義數(shù)據(jù)類型
- 例如:C語言中:
- 一些最基本數(shù)據(jù)結(jié)構(gòu)可以用數(shù)據(jù)類型來實(shí)現(xiàn),如:數(shù)組,字符串等;
- 而另一些常用的數(shù)據(jù)結(jié)構(gòu),如:棧,隊(duì)列,樹,圖等,不能直接用數(shù)據(jù)結(jié)構(gòu)類型來表示
- 高級語言中的數(shù)據(jù)類型明顯地或隱含地規(guī)定了在程序執(zhí)行器件變量表達(dá)的所有可能的取值范圍,以及在這些數(shù)值范圍上所允許進(jìn)行的操作
- 例如:C語言中定義變量i為int 類型,就是表示i是[-min,max]范圍的整數(shù),在這個(gè)整數(shù)集上可以進(jìn)行+,-。,/,%等操作
- 數(shù)據(jù)類型的作用:1.約束變量或常量的取值范圍2.約束變量或常量的操作
- 例如:C語言中定義變量i為int 類型,就是表示i是[-min,max]范圍的整數(shù),在這個(gè)整數(shù)集上可以進(jìn)行+,-。,/,%等操作
- 數(shù)據(jù)類型(Data Type)
- 定義:數(shù)據(jù)類型是一組性質(zhì)相同的值的集合以及定義于這個(gè)值集合上的一組操作的總稱
- 數(shù)據(jù)類型=值的集合+值集合上的一組操作
- 抽象數(shù)據(jù)類型(Abstract Data Tpye,ADT)
- 是指一個(gè)數(shù)學(xué)模型以及定義在此數(shù)學(xué)模型上的一組操作
- 由用戶定義,從問題抽象出數(shù)據(jù)模型(邏輯結(jié)構(gòu))
- 還包括定義在數(shù)據(jù)模型上的一組抽象運(yùn)算(相關(guān)操作)
- 不考慮計(jì)算機(jī)內(nèi)的具體存儲(chǔ)結(jié)構(gòu)與運(yùn)算的具體實(shí)現(xiàn)算法
- 抽象數(shù)據(jù)類型的形式定義
- 抽象數(shù)據(jù)類型可用(D S P)三元組表示
- 其中:D是數(shù)據(jù)對象? ?S是D上關(guān)系集? ? ?P是對D的基本操作集
- 一個(gè)抽象數(shù)據(jù)類型的定義格式如下:
ADT? 抽象數(shù)據(jù)類型名{
? ? ? ? 數(shù)據(jù)對象:<數(shù)據(jù)對象的定義>
? ? ? ? 數(shù)據(jù)關(guān)系:<數(shù)據(jù)關(guān)系的定義>
? ? ? ? 基本操作:<基本操作的定義>
}ADT 抽象數(shù)據(jù)類型名
其中:
- 數(shù)據(jù)對象,數(shù)據(jù)關(guān)系的定義用偽代碼描述
- 基本操作的定義格式為:
- 基本操作名(參數(shù)表)
- 初始條件:(初始條件描述)
- 操作結(jié)果:(操作結(jié)果描述)
- 基本操作定義格式說明:
- 參數(shù)表:
- 賦值參數(shù) 只為操作提供輸入值
- 引用參數(shù) 以&打頭,除可提供輸入值,還將返回操作結(jié)果
- 初始條件:描述操作執(zhí)行之前數(shù)據(jù)結(jié)構(gòu)和參數(shù)應(yīng)滿足的條件,若不滿足則操作失敗,并返回相應(yīng)出錯(cuò)信息。若初始條件為空,則省略之
- 操作結(jié)果:說明操作正常完成之后,數(shù)據(jù)結(jié)構(gòu)的變化狀況和應(yīng)返回的結(jié)果
- 參數(shù)表:
?
1.3抽象數(shù)據(jù)類型的表示與實(shí)現(xiàn)
- 抽象數(shù)據(jù)類型可用通過固有的數(shù)據(jù)類型(如整型,實(shí)型,字符型)來表示和實(shí)現(xiàn)
- 即利用處理器中已經(jīng)存在的數(shù)據(jù)類型來說明新的結(jié)構(gòu),用已經(jīng)實(shí)現(xiàn)的操作作為新的操作
1.4算法和算法分析
- 算法的定義
- 對特定問題求解和步驟的一種描述,他是指令的有限序列,其中每個(gè)指令表示一個(gè)或者多個(gè)操作:簡而言之,算法就是解決問題的方法和步驟
- 算法的描述
- 自然語言:英語,中文
- 流程圖:傳統(tǒng)流程圖,NS流程圖
- 偽代碼:類語言:類c語言
- 程序代碼:C語言程序,JAVA語言程序
- 算法與程序
- 算法是解決問題的一種或者一個(gè)過程,考慮如何將輸入轉(zhuǎn)換成輸出,一個(gè)問題可以有多種算法
- 程序是用某種程序設(shè)計(jì)語言對算法的具體實(shí)現(xiàn)
- 程序=數(shù)據(jù)結(jié)構(gòu)+算法
- 數(shù)據(jù)結(jié)構(gòu)通過算法實(shí)現(xiàn)操作
- 算法根據(jù)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)程序
- 算法特性:一個(gè)算法必須具備以下五個(gè)重要特性
- 有窮性:一個(gè)算法必須總是在執(zhí)行有窮步之后結(jié)束,且每一步都在有窮時(shí)間內(nèi)完成
- 確定性:算法中的每一條指令必須有確切的含義,沒有二義性,在任何條件下,只有唯一的一條執(zhí)行路徑,即對于相同的輸入只能得到相同的輸出
- 可行性:算法是可執(zhí)行的,算法描述的操作可以通過已經(jīng)實(shí)現(xiàn)的基本操作執(zhí)行有限次來實(shí)現(xiàn)
- 輸入:一個(gè)算法有零個(gè)或者多個(gè)輸入
- 輸出:一個(gè)算法有一個(gè)或者多個(gè)輸入
- 算法設(shè)計(jì)的要求
- 正確性(Correctness):算法滿足問題要求,能正確解決問題算法轉(zhuǎn)化為程序后要注意:
- 可讀性(Readability):
- 健壯性(Robustness)
- 高效性(Efficiency)
?算法效率以下兩個(gè)方面來考慮:
- 算法時(shí)間效率的度量
- 算法時(shí)間效率可以用依據(jù)該算法編制的程序在計(jì)算機(jī)上執(zhí)行所消耗的時(shí)間來度量
- 兩種度量方法
- 事后統(tǒng)計(jì)
- 將算法實(shí)現(xiàn),測算其時(shí)間和空間開銷
- 缺點(diǎn):編寫程序?qū)崿F(xiàn)算法將花費(fèi)較多時(shí)間和精力:所得實(shí)驗(yàn)結(jié)果依賴于計(jì)算機(jī)的軟硬件等環(huán)境因素,掩蓋算法本身的優(yōu)劣
- 事前分析
- 對算法所消耗資源的一種估算方法
- 事前分析方法:
- 一個(gè)算法的運(yùn)行時(shí)間是指一個(gè)算法在計(jì)算機(jī)上運(yùn)行所耗費(fèi)的時(shí)間大致可以等于計(jì)算機(jī)執(zhí)行一種簡單的操作(如賦值,比較,移動(dòng)等)所需的時(shí)間與算法中進(jìn)行的簡單操作次數(shù)乘積
- 算法運(yùn)行時(shí)間=一個(gè)簡單操作所需的時(shí)間*簡單那操作次數(shù)
- 也即算法中每條語句的執(zhí)行時(shí)間之和
- 算法運(yùn)行時(shí)間=每條語句執(zhí)行次數(shù)*該語句執(zhí)行一次所需要的時(shí)間
- 算法運(yùn)行時(shí)間=每條語句頻度*該語句執(zhí)行一次所需的時(shí)間
- 事后統(tǒng)計(jì)
?例如:兩個(gè)n*n矩陣相乘的算法可描述為:
for(i=1;i<=n;i++) //執(zhí)行n+1次for(j=1;j<=n;j++){//n(n+1)次c[i][j]=0;//n*n次for(k=0;k<n;k++)//n*n*(n+1)次c[i][j]=c[i][j]+a[i][k]*b[k][j];//n*n*n次 }?我們把算法所耗費(fèi)的時(shí)間定義為該算法中每條語句的頻度之和,則上述算法的時(shí)間消耗T(n)
為:T(n)=2n^3+3n^2+2n+1;這是一個(gè)關(guān)于n的函數(shù)
算法時(shí)間復(fù)雜度的漸進(jìn)表示法
- 為了便于比較不同算法的時(shí)間效率,我們僅比較它們的數(shù)量級?
- 例如:兩個(gè)不同的算法,時(shí)間消耗分別是
- T1(n)=10n^2? ? ? ? T2(n)=5n^3
- 數(shù)量級越大越不好
- 例如:兩個(gè)不同的算法,時(shí)間消耗分別是
- 若有某個(gè)輔助函數(shù)f(n),使得當(dāng)n趨近于無窮大時(shí),T(n)/f(n)的極限值為不等于零的常數(shù),則稱f(n)是T(n)的同數(shù)量級函數(shù).記作T(n)=O(f(n)).稱O(f(n))為算法的漸進(jìn)時(shí)間復(fù)雜度(O是數(shù)量級的符號(hào)),簡稱時(shí)間復(fù)雜度
對于求解矩陣相乘問題,算法耗費(fèi)時(shí)間:
? ? ? ? T(n)=2n^3+3n^2+2n+1
?∞時(shí)候,T(n)/n^32,這表示n充分大時(shí),T(n)與n^3是同階或者同數(shù)量級,引入大"O"記號(hào),則T(n)可記為:T(n)=O(n^3)
一般情況下,不必計(jì)算所有操作的執(zhí)行次數(shù),而只考慮算法中基本操作執(zhí)行的次數(shù),它是問題規(guī)模n的某個(gè)函數(shù),用T(n)表示。
????????算法中基本語句重復(fù)執(zhí)行的次數(shù)是問題規(guī)模n的某個(gè)函數(shù)f(n) 算法的時(shí)間度量記作:
T(n)=O(f(n));
? ? ? ? 它表示隨著n的增大,算法執(zhí)行的時(shí)間的增長率和f(n)的增長率相同,稱為漸進(jìn)時(shí)間復(fù)雜度。
基本語句:?
- ?算法中重復(fù)執(zhí)行次數(shù)和算法的執(zhí)行時(shí)間成正比的語句
- 對算法運(yùn)行時(shí)間的貢獻(xiàn)最大
- 執(zhí)行次數(shù)最多
問題規(guī)模:
- n越大算法的執(zhí)行時(shí)間越長
- 排序:n為記錄數(shù)
- 矩陣:n為矩陣的階數(shù)
- 多項(xiàng)式:n為多項(xiàng)式的項(xiàng)數(shù)
- 集合:n為元素的集合
- 樹:n為樹的結(jié)點(diǎn)個(gè)數(shù)
- 圖:n為圖的頂點(diǎn)樹或邊數(shù)
分析算法時(shí)間復(fù)雜度的基本方法:
?
?忽略所有低次冪項(xiàng)和最高次冪系數(shù),體現(xiàn)出增長率的含義
1.找出語句頻度最大的那條語句作為基本語句
2.計(jì)算基本語句的頻度得到問題規(guī)模n的某個(gè)函數(shù)f(n)
3.取其數(shù)量級用符號(hào)“O”表示
時(shí)間復(fù)雜度是由嵌套最深層語句的頻度決定的
例題:
i=1;
while(i<=n)
????????i=i*2;
所以時(shí)間復(fù)雜度是O(log2? n)
?
?請注意:有的情況下,算法中基本操作重復(fù)執(zhí)行的次數(shù)還隨問題的輸入數(shù)據(jù)集不同而不同
例如:順序查找,在數(shù)組a[i]中查找值等于e的元素,返回其所在位置
for(i=0;i<n;i++)if(a[i]==e)return i+1;//找到,則返回第幾個(gè)元素return 0;- 最好情況:1次
- 最壞情況:n次
- 平均·時(shí)間復(fù)雜度為:O(n)
- 算法時(shí)間復(fù)雜度
- 最壞時(shí)間復(fù)雜度:指在最壞情況下,算法的時(shí)間復(fù)雜度
- 平均時(shí)間復(fù)雜度:值在所有可能輸入實(shí)例在等概率出現(xiàn)的情況下,算法的期望運(yùn)行時(shí)間
- 最好時(shí)間復(fù)雜度:指在最好情況下,算法的時(shí)間復(fù)雜度
- 一般總是考慮在最壞情況下的時(shí)間復(fù)雜度,以保證算法的運(yùn)行時(shí)間不會(huì)比他更長
?對于復(fù)雜的算法,可將它分成幾個(gè)容易估算的部分,然后利用大O的加法法則和乘法法則,計(jì)算算法的時(shí)間復(fù)雜度:
?算法時(shí)間效率的比較
- 當(dāng)n取得很大時(shí),指數(shù)時(shí)間算法和多項(xiàng)式時(shí)間算法在所需時(shí)間上非常懸殊
?
?時(shí)間復(fù)雜度T(n)按數(shù)量級遞增順序?yàn)?#xff1a;
漸進(jìn)空間復(fù)雜度
- 空間復(fù)雜度:算法所需存儲(chǔ)空間的度量,記作:S(n)=O(f(n))其中n為問題的規(guī)模(或大小)
- 算法要占用的空間
- 算法本身要占據(jù)的空間,輸入/輸出,指令,常數(shù),變量等
- 算法要使用輔助空間
?例題:將一維數(shù)組a中的n個(gè)數(shù)逆序存放到原數(shù)組中
算法一 for(i=0;i<n/2;i++) {t=a[i];a[i]=a[n-i-1];a[n-i-1]=t; }//S(n)=O(1)稱為常數(shù):原地工作 算法二 for(i=0;i<n;i++) {b[i]=a[n-i-1]; } for(i=0;i<n;i++) {a[i]=b[i]; } //S(n)=O(n)總結(jié)
- 上一篇: python编写直角三角形边长公式_py
- 下一篇: vs2013配置qt5.7.0