一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

 youxd 2017-05-14

我們使用的計算機絕大多數都是馮·諾依曼體系,其理論基礎就是”存儲程序“概念。數據和操作數據的指令都需要先存儲到地址線性表示的內存單元中。數據的一般操作有”增、查、刪、改、遍歷“等,數據存儲需要”存得進、取得出”,需要考慮時間和空間效率,所以要“存數值、存聯(lián)系”,數據的存儲不僅需要保存數據本身,還需要考慮保存數據本身的邏輯關系。

程序要處理的數據有數值類或非數值類兩種類型。數值類處理的是純數值性的信息,如科學和工程計算。數值類數據的關系一般用數學公式或方程來描述。而非數值類問題的數據及數據間的相應關系一般無法用數學公式或方程來描述,如排序問題、檢索問題,需要另外設計數據的描述方法和相應的算法來處理。

所以,用計算機解決實際問題,需要對解決的問題進行分析,提煉出問題的兩個要素:信息和功能。(數據描述和數據處理的步驟描述,也就是數據結構和算法)。

分析問題中的已知信息,提煉數據和數據之間的聯(lián)系(數據的邏輯結構),選用合適的存儲方式(數據的存儲結構)將邏輯結構(數據元素和邏輯關系)存到計算機中,然后在存儲結構之上按照自頂向下逐步細化的方法給出算法。這就是程序設計思維的一般過程。

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

上圖中,程序設計將算法”翻譯“成相應命令語句及處理形成代碼。

一般來說,一個邏輯數據結構可能有多種存儲結構,在不同的存儲結構之上,數據處理的效率不盡相同。許多時候,確定數據結構后,算法就容易找到了。有些時候事情也會反過來,我們根據特定的算法來選擇數據結構與之適應。

程序設計中信息的抽象是用標識符、常量、變量、數組和結構體等描述和記錄信息及信息間的關系。

下表是一般編程的解題步驟與從軟件工程角度看這些步驟的對應關系。

程序解題軟件工程具體工作
建模型需求分析階段提取問題要完成的功能;分析問題的數據對象,找出數據對象之間的關系
設計設計階段數據結構設計、軟件的結構設計、算法設計
編程編碼階段編寫程序代碼
驗證測試軟件測試與調試

1 數據類型與抽象數據類型

計算機對數據的處理,就如同工廠對“物料”的處理一樣,物料如同數據,工藝如同算法。一般來說,按照“存儲程序”概念,數據需要保存到“一格一格”的內存單元中,根據數據種類、數量的多少、數據元素的復雜程度,對應的數據結構和復雜度也會有所區(qū)別。如果數據量少,數據元素聯(lián)系簡單,則用簡單的基本數據類型如變量、數組即可描述需要處理的數據,用簡單的一些表達式即可描述算法。如果數據量大,數據元素聯(lián)系復雜(普通數學方程無法描述),則需要定義或選擇復雜的數據結構(抽象數據類型),如棧、樹、圖等,以及復雜的算法。

1.1 數據類型(data type)是一組性質相同的值的集合和定義在集合上的一級操作的總稱。

1.2 抽象數據類型(Abstract Data Type,ADT)指的是用戶進行軟件系統(tǒng)設計時從問題的數學模型中抽象出來的邏輯數據結構和邏輯數據結構上的運算,而不考慮計算機的具體存儲結構和運算的具體實現(xiàn)算法。抽象數據類型中的數據對象和數據運算的聲明與數據對象的表示和數據運算的實現(xiàn)相互分離。

一個具體問題的抽象數據類型的定義通常采用簡潔、嚴謹的文字描述,一般包括數據對象(即數據元素的集合)、數據元素關系和基本運算三方面的內容。其基本格式可描述如下:

ADT 抽象數據類型名

{

數據對象Data

數據關系Relation

基本運算Operation

}

(Data和Relation一般可以用結構體或類數據成員定義,Operation一般可以用函數(數據結構算法)或類成員函數定義。)

如,線性表的抽象數據類型:

ADT 抽象數據類型名

{

數據對象:任意數據元素的集合

數據關系:除第一個和最后一個外,每個元素都有唯一的直接前驅和唯一的直接后繼

基本運算:

ListInsert(&L,i,e); //元素的插入

ListDelete(&L,i,e); //元素的刪除

...

}ADT list

2 數據元素及聯(lián)系(邏輯結構)

現(xiàn)實世界是復雜的,抽象后的數據也有線性、非線性、集合的邏輯關系,而計算機內部的存儲單元地址只是線性關系,所以數據元素邏輯關系與實際存儲的映射會形成不同的數據結構和算法,會有不同的時間和空間效率。

數據結構的含義包括三個方面-數據的邏輯結構、數據的存儲結構以及數據的運算(如增、查、刪、改)。數據的邏輯結構體現(xiàn)在數據的聯(lián)系,數據的存儲是數據在計算機中的體現(xiàn)。

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

3 數據存儲(存儲結構)

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

3.1 順序存儲結構 Sequential storage strcture

是采用一組連續(xù)的存儲單元存放所有的數據元素,也就是說,所有數據元素在存儲器中占有一整塊存儲空間,而且兩個邏輯上相鄰的元素在存儲器中的存儲位置也相鄰。因此,數據元素之間的邏輯關系由存儲單元地址間的關系隱含表示,即順序存儲結構將數據的邏輯結構直接映射到存儲結構。

順序存儲結構的主要優(yōu)點是存儲效率高,因為分配給數據的存儲單元全用于存放數據元素,元素之間的邏輯關系沒有占用額外的存儲空間;另外,在采用這種存儲方法時可實現(xiàn)對元素的隨機存儲,即每個元素對應一個邏輯序號,由該序號可以直接計算出對應元素的存儲地址,從而獲取元素值。順序存儲結構的主要缺點是不便于數據修改,對元素的插入或刪除操作可能需要移動一系列的元素。

3.2 鏈式存儲結構 Linked storage structure

在鏈式存儲結構中,每個邏輯元素用一個內存結點存儲,每個結點是單獨分配的,所有的結點地址不一定是連續(xù)的,所以無須占用一整塊存儲空間。為了表示元素之間的邏輯關系,給每個結點附加指針域,用于存放相鄰結點的存儲地址,也就是通過指針域將所有結點鏈接起來,這就是鏈式存儲結構名稱的由來。

3.3 順序存儲與鏈式存儲二者優(yōu)、缺點對比

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

順序存儲結構鏈式存儲結構
存儲效率存儲效率高,因為分配給數據的存儲單元全用于存放數據元素,元素之間的邏輯關系沒有占用額外的存儲空間;存儲空間的利用率低,因為分配給元素的存儲單元有一部分被用來存儲結點之間的邏輯關系;
訪問元素可實現(xiàn)對元素的隨機存取,即每個元素對應一個邏輯序號,由該序號可以直接計算出對應元素的存儲地址,從而獲取元素值。由于邏輯上相鄰的元素在存儲空間中不一定相鄰,所以不能對元素進行隨機存取。
插入和刪除不便于數據修改,對元素的插入或刪除操作可能需要移動一系列的元素。便于數據修改,在對元素進行插入和刪除操作時僅需修改相應結點的指針域,不必移動結點。

3.4 索引存儲結構 Indexed storage structure

索引存儲結構是指在存儲數據元素信息的同時還建立附加的索引表。存儲所有數據元素信息的表稱為主數據表,其中每個數據元素有一個關鍵字和對應的存儲地址。索引表中的每一項稱為索引項,索引項的一般形式為“關鍵字,地址”,其中“關鍵字”唯一標識一個元素,“地址”對應該關鍵字的元素在主數據表中的存儲地址。通常,索引表中的所有索引項是按關鍵字有序排列的。

在按關鍵字查找時,首先在索引表中利用關鍵字的有序性快速查找到該關鍵字的地址,然后通過該地址在主數據表中找到對應的元素。

索引存儲結構的優(yōu)點是查找效率高。缺點是需要建立索引表,從而增加了空間開銷。

3.5 哈希(或散列)存儲結構 Hashed storage structure

哈希存儲結構的基本思想是根據元素的關鍵字通過哈希(或散列)函數直接算出一個值,并將這個值作為該元素的存儲地址。

哈希存儲結構的優(yōu)點是查找速度快,只要給出待查元素的關鍵字就可立即計算出該元素的存儲地址。與前3種存儲方法不同的是,哈希存儲方法只存儲元素的數據,不存儲元素之間的邏輯關系。哈希存儲結構一般只適合要求對數據能夠進行快速查找和插入的場合。

4 數據運算(增、查、刪、改)

數據運算是指對數據實施的操作。每種數據結構都有一組相應的運算,最常用的運算有檢索、插入、刪除、更新和排序等。數據運算最終需要在對應的存儲結構上用算法實現(xiàn),所以數據運算分為運算定義和運算實現(xiàn)兩個層面。

5 數據結構具體類型

5.1 線性表包括順序表和鏈表兩種類型。

5.2 :操作都在表的一端(棧頂,top)進行,按先入(插入)后出(刪除)的方式管理的線性表;棧相對于線性表來說,不需要考慮數組的下標增減等細節(jié),而直接使用對棧的Push和Pop操作。如回退操作、遞歸調用、函數調用等可以方便地用到這種受限的線性表結構。

5.3 隊列:一端插入(隊尾)一端刪除(隊頭)的線性表。

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號??船F(xiàn)實世界中的存儲(如何操作可以能存能?。?/p>

順序表找一個連續(xù)的四周開放的空間,一臺一臺按順序放好;
鏈表不考慮連續(xù)的空間,有一臺的位置就放一臺,但每一臺的位置放一張卡片,標明下一臺的放置位置;
20臺疊起來放;或者放到一個三端封閉的空間,只有一端可以存、取操作;
隊列找一個兩邊封閉的空間,一端放,一端?。?/td>

5.4 樹結構:反映一種層次的縱向關系,如計算機文件系統(tǒng)的目錄結構。其存儲的數據邏輯關系是每一個結點都有1個或0個雙親(parent)結點,n個或0個子(child)結點。樹結構的基本操作包括:構造、插入、刪除、遍歷、深度、查找等。堆通常是一個可以被看做一棵樹(完全二叉樹)的數組對象。

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

5.5 廣義表:包含子結構的線性結構,是線性表的推廣,但是一種非線性結構類型。

5.6 圖結構:數據結構中的圖不是幾何平面中的圖的概念,而是拓撲意義上的圖。通常平面幾何或立體幾何研究的對象是點、線、面之間的位置關系以及它們的度量性質。拓撲學研究幾何圖形在連續(xù)變形下保持不變的性質。如地鐵線路圖就是應用了拓撲學的原理。通常在平面幾何中,把平面上的一個圖形搬到另一個圖形上,如果完全重合,那么這兩個圖形叫做全等形。但在拓撲學中,無論圖的大小或者形狀怎么變化,只要其中點和線的數量不變,它們就是等價圖。

圖是一種比線性表和樹形結構更為復雜的非線性數據結構,圖對結點的前驅和后繼個數不加限制,各數據元素之間的關系可以是任意的,描述的是“多對多”的關系。在數據結構中,考慮的是圖在計算機中的存儲和操作。

圖是由頂點和邊構成,除了要存儲結點的信息,還要存儲邊的信息。另外,圖有無向圖、有序圖、加權圖等、

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

面向對象偏向結構——在數據結構的基礎上加入自我實現(xiàn)的算法 而函數式編程則是偏向函數(算法)——函數也是對象,就是函數的數據化,讓算法也可以自由組合。

6 算法

在分析處理的問題、確定的需要的數據結構、完成了數據的存儲之后,接下來的事情就是對數據的加工處理了,對問題求解進行精確描述,也就是算法。

不同的問題有不同的解決方法,同一個問題也可能會有多種算法可供選擇。

算法有5個特征。

  • 有窮性:一個算法必須保證在執(zhí)行有限步驟后結束,而不是無限的;

  • 確定性:算法中每一條指令必須有明確的含義,而不能是含糊不清有歧義的;

  • 可行性:每一個操作步驟必須在有限的時間內完成;

  • 輸入:一個算法可以有多個輸入,也可以沒有輸入;

  • 輸出:一個算法可以有一個或多個輸出,沒有輸出的算法是沒有意義的。

算法的實現(xiàn)由函數完成。算法設計的一般步驟是:

  • 設定算法初始條件;

  • 確定算法的結束條件;

  • 按問題的普遍規(guī)律,給出算法處理的流程;

  • 考慮臨界點或特殊點的處理;

  • 考慮異常情況。

常用算法:遞推法、遞歸法、窮舉法、貪心算法、分治法、動態(tài)規(guī)劃法、迭代法、分支界限法。

算法可大致分為基本算法、數據結構的算法、數論與代數算法、計算幾何的算法、圖論的算法、動態(tài)規(guī)劃以及數值分析、加密算法、排序算法、檢索算法、隨機化算法、并行算法,厄米變形模型,隨機森林算法。

7 數據處理(數據結構和算法)綜述

實際問題中數據的處理,一是根據問題中的信息,抽象出信息中的數據與聯(lián)系,并根據問題的功能要求及數據量的大小,選用合適的存儲結構;二是根據功能要求劃分模塊分別處理;三是測試和調試

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

如,求一個數的階乘n!

5.1 問題分析:可以先選擇一個數值不太大,又不是特殊點的值,如n=5來設計算法的實現(xiàn)。

5.2 測試樣例設計

情形測試數據預期結果
問題的一般情形n>1按照n!一般定義得出的值
臨界點或特殊點n=0,n=1按照n!邊界定義得出的值
異常情況n<>給出錯誤或提示信息

5.3 函數接口及功能描述:

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

5.4 代碼實現(xiàn)

double factorial(int n)

{

int i;

double t=1;

if(n<0) return="">

for(i=1;i<>

{

t=t*i;

}

return(t);

}

5.5 測試結果

編程|深入淺出理解數據結構、算法、編程語言三者的計算思維

萬物皆數,是說一切事物都可以編碼,都可以用符號或數字表示出來,符號或數字的種類只要兩個或兩個以上,然后有適當數量的位數,即可表示萬物。另外,不僅可以用編碼描述事物為數據,數據元素的關系(線性或非線性)亦可用編碼進行描述,這種數據元素和數據元素之間聯(lián)系的描述或編碼也就是數據的邏輯結構。數據的邏輯結構需要保存到計算機編址(線性)的存儲單元中,這就是數據邏輯結構與存儲結構的映射。我們知道,如果是非線性的邏輯結構與線性的邏輯結構的映射,解決起來會稍顯復雜,但非線性的邏輯結構都可用復雜度更高的順序存儲或鏈式存儲加以解決。數據的靜態(tài)存儲不是目的,對數據元素有如“增、查、刪、改”等的運算并能保持原有的映射才能對數據進行進一步的利用,或者說構造了一種新的抽象數據類型,加上編程語言定義的基本數據類型,是對事物進行數據描述的基本手段。上述所有的一切,皆是數據結構的范疇。

有了數據結構,對需要解決的問題便可以在數據結構的基礎上構造數據結構的輸入方式、構造表達式、函數、構造數據輸出方式,形成詳細、明確的步驟,這就是所謂的算法。

當然,一些特殊的問題,有時會先考慮算法,然后構造數據結構。復雜的問題,初期的方案更是在數據結構與算法的相互的選擇取舍中不得優(yōu)化。有了數據結構、算法,選擇合適的編程語言進行描述,便可完成代碼的編寫,通過調試,到最后產生符合解決問題的應用或工具??傊?,數據結構和算法以及與之匹配的編程語言便構成了編程的核心。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    好吊色欧美一区二区三区顽频 | 成人精品欧美一级乱黄| 欧洲精品一区二区三区四区| 91午夜少妇极品福利| 视频一区中文字幕日韩| 高清不卡视频在线观看| 91日韩在线视频观看| 亚洲综合日韩精品欧美综合区| 丰满人妻熟妇乱又乱精品古代| 免费观看日韩一级黄色大片| 亚洲高清中文字幕一区二三区| 亚洲日本加勒比在线播放| 五月激情综合在线视频| 狠狠干狠狠操亚洲综合| 亚洲国产精品av在线观看| 日韩一区二区免费在线观看| 亚洲清纯一区二区三区| 在线观看视频成人午夜| 国产传媒一区二区三区| 亚洲黄香蕉视频免费看| 国产综合欧美日韩在线精品| 欧美成人一区二区三区在线| 欧美日韩精品综合一区| 日韩欧美中文字幕人妻| 久久热这里只有精品视频| 久久99夜色精品噜噜亚洲av | 午夜精品国产一区在线观看| 亚洲天堂男人在线观看| 欧美一级片日韩一级片| 午夜精品麻豆视频91| 国产高清精品福利私拍| 日韩女优精品一区二区三区| 国产三级不卡在线观看视频| 狠狠做深爱婷婷久久综合| 精品推荐久久久国产av| 加勒比东京热拍拍一区二区| 九九热这里只有免费精品| 人妻熟女欲求不满一区二区| 国产在线一区二区三区不卡| 欧美日本亚欧在线观看| 国产精品亚洲欧美一区麻豆|