'深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享'

"

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

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

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

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

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號。看現實世界中的存儲(如何操作可以能存能取)

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

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

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號。看現實世界中的存儲(如何操作可以能存能取)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號。看現實世界中的存儲(如何操作可以能存能取)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號。看現實世界中的存儲(如何操作可以能存能取)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號。看現實世界中的存儲(如何操作可以能存能取)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

6 算法

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

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

算法有5個特徵。

  • 有窮性:一個算法必須保證在執行有限步驟後結束,而不是無限的;
  • 確定性:算法中每一條指令必須有明確的含義,而不能是含糊不清有歧義的;
  • 可行性:每一個操作步驟必須在有限的時間內完成;
  • 輸入:一個算法可以有多個輸入,也可以沒有輸入;
  • 輸出:一個算法可以有一個或多個輸出,沒有輸出的算法是沒有意義的。

算法的實現由函數完成。算法設計的一般步驟是:

  • 設定算法初始條件;
  • 確定算法的結束條件;
  • 按問題的普遍規律,給出算法處理的流程;
  • 考慮臨界點或特殊點的處理;
  • 考慮異常情況。

常用算法:遞推法、遞歸法、窮舉法、貪心算法、分治法、動態規劃法、迭代法、分支界限法。

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

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

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

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號。看現實世界中的存儲(如何操作可以能存能取)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

6 算法

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

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

算法有5個特徵。

  • 有窮性:一個算法必須保證在執行有限步驟後結束,而不是無限的;
  • 確定性:算法中每一條指令必須有明確的含義,而不能是含糊不清有歧義的;
  • 可行性:每一個操作步驟必須在有限的時間內完成;
  • 輸入:一個算法可以有多個輸入,也可以沒有輸入;
  • 輸出:一個算法可以有一個或多個輸出,沒有輸出的算法是沒有意義的。

算法的實現由函數完成。算法設計的一般步驟是:

  • 設定算法初始條件;
  • 確定算法的結束條件;
  • 按問題的普遍規律,給出算法處理的流程;
  • 考慮臨界點或特殊點的處理;
  • 考慮異常情況。

常用算法:遞推法、遞歸法、窮舉法、貪心算法、分治法、動態規劃法、迭代法、分支界限法。

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

如,求一個數的階乘n!

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

5.2 測試樣例設計

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

5.3 函數接口及功能描述:

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號。看現實世界中的存儲(如何操作可以能存能取)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

6 算法

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

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

算法有5個特徵。

  • 有窮性:一個算法必須保證在執行有限步驟後結束,而不是無限的;
  • 確定性:算法中每一條指令必須有明確的含義,而不能是含糊不清有歧義的;
  • 可行性:每一個操作步驟必須在有限的時間內完成;
  • 輸入:一個算法可以有多個輸入,也可以沒有輸入;
  • 輸出:一個算法可以有一個或多個輸出,沒有輸出的算法是沒有意義的。

算法的實現由函數完成。算法設計的一般步驟是:

  • 設定算法初始條件;
  • 確定算法的結束條件;
  • 按問題的普遍規律,給出算法處理的流程;
  • 考慮臨界點或特殊點的處理;
  • 考慮異常情況。

常用算法:遞推法、遞歸法、窮舉法、貪心算法、分治法、動態規劃法、迭代法、分支界限法。

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

如,求一個數的階乘n!

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

5.2 測試樣例設計

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

5.3 函數接口及功能描述:

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

5.4 代碼實現

double factorial(int n)

{

int i;

double t=1;

if(n<0) return (-1);

for(i=1;i<=n;i++)

{

t=t*i;

}

return(t);

}

5.5 測試結果

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號。看現實世界中的存儲(如何操作可以能存能取)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

6 算法

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

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

算法有5個特徵。

  • 有窮性:一個算法必須保證在執行有限步驟後結束,而不是無限的;
  • 確定性:算法中每一條指令必須有明確的含義,而不能是含糊不清有歧義的;
  • 可行性:每一個操作步驟必須在有限的時間內完成;
  • 輸入:一個算法可以有多個輸入,也可以沒有輸入;
  • 輸出:一個算法可以有一個或多個輸出,沒有輸出的算法是沒有意義的。

算法的實現由函數完成。算法設計的一般步驟是:

  • 設定算法初始條件;
  • 確定算法的結束條件;
  • 按問題的普遍規律,給出算法處理的流程;
  • 考慮臨界點或特殊點的處理;
  • 考慮異常情況。

常用算法:遞推法、遞歸法、窮舉法、貪心算法、分治法、動態規劃法、迭代法、分支界限法。

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

如,求一個數的階乘n!

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

5.2 測試樣例設計

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

5.3 函數接口及功能描述:

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

5.4 代碼實現

double factorial(int n)

{

int i;

double t=1;

if(n<0) return (-1);

for(i=1;i<=n;i++)

{

t=t*i;

}

return(t);

}

5.5 測試結果

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

小編為大家準備了一些學習教程,希望可以幫助到大家。

"

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

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

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

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

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

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

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

ADT 抽象數據類型名

{

數據對象Data

數據關係Relation

基本運算Operation

}

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

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

ADT 抽象數據類型名

{

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

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

基本運算:

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

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

...

}ADT list

2 數據元素及聯繫(邏輯結構)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3 數據存儲(存儲結構)

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

3.1 順序存儲結構 Sequential storage strcture

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

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

3.2 鏈式存儲結構 Linked storage structure

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

3.3 順序存儲與鏈式存儲二者優、缺點對比

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

3.4 索引存儲結構 Indexed storage structure

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

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

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

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

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

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

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

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

5 數據結構具體類型

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

假設有20臺包裝好的電視機,放到一個房間,房間有一個位置都標有編號。看現實世界中的存儲(如何操作可以能存能取)

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

6 算法

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

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

算法有5個特徵。

  • 有窮性:一個算法必須保證在執行有限步驟後結束,而不是無限的;
  • 確定性:算法中每一條指令必須有明確的含義,而不能是含糊不清有歧義的;
  • 可行性:每一個操作步驟必須在有限的時間內完成;
  • 輸入:一個算法可以有多個輸入,也可以沒有輸入;
  • 輸出:一個算法可以有一個或多個輸出,沒有輸出的算法是沒有意義的。

算法的實現由函數完成。算法設計的一般步驟是:

  • 設定算法初始條件;
  • 確定算法的結束條件;
  • 按問題的普遍規律,給出算法處理的流程;
  • 考慮臨界點或特殊點的處理;
  • 考慮異常情況。

常用算法:遞推法、遞歸法、窮舉法、貪心算法、分治法、動態規劃法、迭代法、分支界限法。

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

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

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

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

如,求一個數的階乘n!

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

5.2 測試樣例設計

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

5.3 函數接口及功能描述:

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

5.4 代碼實現

double factorial(int n)

{

int i;

double t=1;

if(n<0) return (-1);

for(i=1;i<=n;i++)

{

t=t*i;

}

return(t);

}

5.5 測試結果

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

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

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

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

小編為大家準備了一些學習教程,希望可以幫助到大家。

深入瞭解數據結構、算法、編程語言三者的計算思維(附教程分享

獲取方式:請大家關注並私信小編關鍵詞:“資料”即可獲取。

"

相關推薦

推薦中...