數據結構概述

數據結構概述

數據結構是介於數學、計算機硬件和計算機軟件之間的一門核心課程。
數據結構所要研究的主要內容簡單概括爲如下3個方面:
研究數據元素之間的客觀聯繫(邏輯結構);
研究數據在計算機內部的存儲方式(存儲結構);
研究如何在數據的各類結構上實施有效的操做或處理。
因此數據結構是一門抽象地研究數據之間的關係的學科。算法

1、數據

數據(data)在計算機科學中是指輸入到計算機中並可以被計算機識別、存儲和加工處理的符號的總稱。數組

如下是一些經常使用的名詞及其釋義。數據結構

1.數據項

數據的基本物理單位是數據項。數據項是指具備獨立含義的最小識別單位。數據項具備原子性。數據項又稱爲項或字段。app

數據項有邏輯形式(logical form)和物理形式(physical form)兩方面。
用ADT給出的數據項的定義是它的邏輯形式。數據結構中對數據項的實現是它的物理形式。dom

2.數據元素

數據元素(data element)是數據邏輯意義上的基本單位,一般把數據元素做爲一個總體進行考慮和處理。數據元素可由一個或多個數據項組成。數據結構和算法

3.數據對象

數據對象(data object)是性質相同的數據元素的集合,是數據的子集。函數

4.數據域

當數據元素由若干個數據項組成時,對應於各個數據項的子位串稱爲數據域工具

5.指針域

在非順序映像中藉助指示元素存儲地址,描述數據元素之間邏輯關係的部分稱爲指針域性能

6.結點

1>定義

計算機中表示信息的最小單位是二進制數的一位,稱爲位(bit)。
由若干位串表示一個數據元素,稱爲元素或結點
結點也能夠描述爲數據處理的數據單位,它多是一條記錄、一個數據項或組合數據項。spa

2>分類

對應結點定義根據結點所處位置的不一樣能夠將表中的結點分爲前趨結點和後繼結點。
對錶中任意結點,有如下概念:
處於該結點以前的全部結點稱爲該結點的前趨結點。
處於該結點以後的全部結點稱爲該結點的後繼結點。
與之相鄰的前趨結點稱爲直接前趨結點。
與之相鄰的後繼結點稱爲直接後繼結點。
表中的第一個結點稱爲開始結點。
表中的最後一個沒有後繼的結點稱爲終端結點。

2、數據關係

在數據結構中數據之間的關係主要有兩種,它們分別是線性關係非線性關係
其中非線性關係又可分爲樹形關係圖關係
數據的邏輯結構和存儲結構是密不可分的兩方面,在實現算法時,首先應該解決數據的存儲問題。
數據之間紀要考慮存儲,又要考慮數據單位之間的關係,在肯定存儲結構以後,根據存儲的結構再來肯定相應的操做的實現方法。

3、數據結構

結構一般指關係,因此數據結構是指數據之間的關係的一門學科,它表示的是數據之間的相互形式,機數據的組織形式。

1.定義

數據結構是研究數據的存儲、數據之間的關係及對數據實現各類操做的一門學科。

數據結構(data structure)是指相互之間存在一種或多種特定關係的數據元素的集合。是組織並存儲數據以便可以有效使用的一種專門格式,它用來反映一個數據的內部構成,即一個數據由那些成分數據構成,以什麼方式構成,呈什麼結構。

數據結構的定義能夠記做:Data-Structure=(D,R)
D是數據元素的有限集合,R是D上的關係。
數據的存儲結構要可以正確反映數據元素之間的邏輯關係。

任何一種算法的設計取決於選定的邏輯結構,而算法的實現則依賴於採用的存儲結構。

2.分類

根據用戶和計算機兩個角度能夠將數據結構分爲邏輯機構和存儲結構。其實也就是根據抽象和具象進行分類。
根據數據的結構特性在數據的生存期間的變更狀況,能夠將數據分爲靜態結構和動態結構

1>邏輯結構

邏輯結構又叫抽象結構
通常狀況下,「關係」是指數據元素之間存在的邏輯關係,也稱爲數據的邏輯結構
邏輯結構體現的是數據元素之間的邏輯關係。

①描述方式

數據的邏輯結構能夠採用兩種方法來描述:二元組、圖形。

1)二元組

數據結構的二元組表示形式爲:
數據結構= {D , S}
其中D是數據元素的集合;S是D中數據元素之間的關係集合,而且數據元素之間的關係是使用序偶來表示的。序偶是由兩個元素x和y按必定順序排列而成的二元組,記做<x , y>,x是它的第一元素,y是它的第二元素。

2)圖形

當使用圖形來表示數據結構時,是用圖形中的點來表示數據元素,用圖形中的弧來表示數據元素之間的關係。若是數據元素x與y之間有關係<x , y>,則在圖形中有從表示x的點出發到達表示y的點的一條弧。

②分類

按照數據元素之間相互關係的特性來分,能夠分爲如下四種結構:集合、線性結構、樹形結構和圖狀結構
只考慮數據元素而不考慮它們之間的關係的數據結構稱爲集合結構。
具備線性關係的數據結構稱爲線性結構。
除了一個數據元素意外,每一個數據元素有且僅有一個直接前趨元素,但能夠有多個直接後續元素的數據結構稱爲樹結構。
每一個數據元素能夠有多個直接前趨元素,也能夠有多個直接後續元素的數據結構稱爲圖結構。

2>物理結構

物理結構又叫存儲結構。
數據在計算機內的存儲表示(或映像)稱爲數據的存儲結構或者物理結構
它包括數據元素的表示和關係的表示。
數據元素之間的關係在計算機中主要有兩種不一樣的表示方法:順序映像(Sequential Mapping)和非順序映像,並由此獲得兩種不一樣的存儲結構:順序存儲結構和鏈式存儲結構。

①順序存儲結構

特色:
在順序存儲結構中體現數據之間的關係。
順序映像是藉助元素在存儲器中位置表示數據元素之間的邏輯關係,或邏輯上相鄰的結點存儲在物理位置上相鄰的存儲單元裏,結點的邏輯關係由存儲單元的鄰接關係來體現。

②非順序存儲結構

非順序結構通常採用指針實現數據之間的關係。
包括鏈式存儲結構(鏈表)、散列結構和索引存儲結構等。
非順序映像是藉助元素與存儲地址的指針表示元素之間的邏輯關係,或邏輯上相鄰的結點在物理位置上可相鄰,可不相鄰,邏輯關係由附加的指針段表示。

1)鏈式存儲結構

鏈式存儲結構利用指針直接表示數據元素之間的關係。

2)散列結構

散列結構的基本思想是根據結點的關鍵字,利用散列函數直接計算出該結點的存儲地址。

3)索引存儲結構

索引存儲結構是值在存儲結點信息的同時,還簡歷附加的索引表。
索引表的每一項稱爲索引項,索引項的通常形式是:關鍵字,地址。
關鍵字是可以惟一標識一個結點的那些數據項集合。
索引結構分爲稠密索引和稀疏索引。

<1>稠密索引

稠密索引是指每一個結點在索引表中都有一個索引項的索引表。

<2>稀疏索引

稀疏索引是指一組結點在索引表中對應一個索引項的索引表。

3>動態結構

動態結構是指在必定範圍內結構的大小能夠發生變更。如:堆棧、隊列以及樹形結構等。

4>靜態結構

靜態結構是指在數據存在期不發生任何變更。如:靜態數組。

4、數據類型

1.定義

數據類型(data type)是指一組性質相同的數據元素的集合以及加在這個集合上的一組操做。

定義數據類型的做用:
1.隱藏計算機硬件及其特性和差異。使硬件對於用戶而言是透明的,即用戶能夠不關心數據類型是怎麼實現的而可使用它。
2.用戶可以使用數據類型定義的操做,方便的實現問題的求解。

所謂頂層的運算步驟是指定義在數據模型級上的運算步驟,或叫宏觀運算。
涉及的運算以數據模型中的數據變量做爲運算對象,或做爲運算結果,或兩者兼而爲之,簡稱爲定義在數據模型上的運算。

所謂底層的運算步驟是指頂層抽象的運算的具體實現。
底層的運算步驟包括兩部分:一是數據模型的具體表示;二是定義在該數據模型上的運算的具體實現。
底層運算是頂層運算的細化,底層運算爲頂層運算服務。

2.分類

數據類型根據是否容許分解可分爲原子類型和結構類型。

1>原子類型

原子類型是指其值不可再分的數據類型。例如:整形、字符型。
計算機硬件的原子類型:位、字節、字

2>結構類型

結構類型是指其值能夠再分解爲若干成分的數據類型。

5、抽象數據類型

爲了將頂層算法與底層算法隔開,使兩者在設計時不會互相牽制、互相影響,必須對兩者的接口進行一次抽象。讓底層只經過這個接口爲頂層服務,頂層也只經過這個接口調用底層的運算。這個接口就是抽象數據類型。

1.定義

抽象數據類型(Abstract Data Type,ADT)由一種數據模型和在該數據模型上的一組操做組成。

抽象數據類型包括定義和實現兩個方面,其中定義是獨立於實現的。
抽象數據類型的定義取決於它的一組邏輯特性,與其在計算機內的表示和實現無關。

數據結構是ADT的物理實現。

抽象數據類型比數據類型的範疇更廣,它不只侷限在處理器中已經定義並實現的數據類型,還包括用戶在設計軟件時本身定義的數據類型。

抽象數據類型的三元組表示:ADT=(D,S,P)
其中,D表示數據對象,S是D上的關係集,P是加在D上的一組操做。
ADT可使用如下格式描述:

ADT抽象數據類型名{
  數據對象:<數據對象的定義>
  數據關係:<數據關係的定義>
  基本操做:<基本操做的定義>
}ADT抽象數據類型名

2.分類

抽象數據類型的定義由一個值域和定義在該值域上的一組操做組成,若是按照其值的不一樣特性,可細分爲3種類型:
原子類型:屬於原子類型的變量的值是不可再分的。
固定聚合類型:屬於該類型的變量的值由肯定數目的成分按照某種結構組成。
可變聚合類型:屬於該類型的變量的值的成分數目不肯定,其中序列的長度是可變的。
固定聚合類型和可變聚合類型統稱爲結構類型。

3.應用案例

1>Java中的int

整數的數學概念和施加到整數的運算就構成了一個ADT。Java中的變量類型int就是對這個抽象類型的物理實現。
可是int型變量有必定的取值範圍,因此對這個抽象的整型的實現不徹底正確,若是沒法接受該限制,就必須引進一些其餘的實現方式來實現這個抽象類型,好比:long類型。

2>整數線性表

一個整數線性表的ADT應包含如下操做:
1.數據的存儲結構肯定線性關係。
2.把一個新整數插入到表尾。
3.按線性表的元素順序依次打印。
4.刪除線性表的某個元素。
5.判斷線性表是否存在某個元素,成功返回true,失敗返回false。
6.將線性表的整數排序。

3>三元組定義

抽象數據類型的三元組定義以下:

ADT Tri{
  數據對象:D={e1,e2,e3|e1,e2,e3∈element(已經定義的數據集合)}
  數據關係:R1={<e1 e2> R2=<e2 e3>}
  基本操做:
  inittri(&t,v1,v2,v3)
  結果:構造三元組t,並將v一、v二、v3賦值給e一、e二、e3完成初始化。
  tansporttri(m,&t)
  結果:將矩陣M轉置爲T。
  addtri(m,n,&q)
  結果:求矩陣m和n和,結果放在q中。
}

4.總結

ADT的概念就是將複雜問題抽象化。抽象化以後的問題是使咱們重視問題而忽略沒必要要的細節。
ADT不一樣於類,區別在於ADT至關於在概念層上描述問題,而類至關於在實現層上描述問題。

6、數據結構的意義

瑞士計算機科學家N.Wirth曾提出:算法+數據結構=程序。
其中數據結構是指數據邏輯結構和物理結構,算法是對數據運算的描述。
程序設計的實質是對具體問題選擇一種好的數據結構,再設計一個好的算法,好的算法同城取決於實際問題的數據結構。
解決問題的關鍵是:選擇合適的數據結構表示問題,而後寫出有效的算法。

7、算法

若是問題是一個須要完成的任務,即對應一組輸入就有一組相應的輸出。只有問題被準肯定義並徹底理解後纔可以研究問題的解決方法。

從數學的角度講,能夠把問題看作函數。函數是輸入(定義域,domain)和輸出(值域,range)之間的一種映射關係。輸入值稱爲函數的參數。不一樣的輸入能夠產生不一樣的輸出,可是給定的輸入,每次必須有相同的輸出。

算法設計是最具創造性的工做之一,人們解決任何問題的思想、方法和步驟實際上均可以認爲是算法。

1.定義

算法(algorithm)是指令的集合,是爲解決特定問題而規定的一系列操做。

算法的結構設計和選擇依賴於做爲其基礎的數據結構。數據結構爲算法提供了工具。
算法是利用這些工具來解決問題的最優方案。

算法就是解決問題的方法,或者算法是解決某個特定問題的一些指令的集合,或者由人們組織起來加以準備實施的有限的基本步驟。
流程圖是圖形化的算法。程序是計算機語言描述的算法。

2.特性

一個完整的算法具有一下5個性質:
1.正確性。算法獲得的結果必須是正確的。
2.肯定性。算法的組成指令必須是清晰的無二義的。
3.有窮性。算法必須在有限的步驟內結束。
4.輸入。算法能夠包含n(n≥0)個數據的輸入。
5.輸出。算法至少有一個輸出。

3.設計要求

設計一個好的算法要達到如下4個目標:
1.正確性。包含結果、輸入、輸出以及執行過程的正確性。也就是這裏的正確性包含算法性質的5個性質。
2.可讀性。算法主要是爲了閱讀與交流,可讀性好有助於對算法的理解。
3.健壯性。當輸入非法數據時,算法可以作出反應或進行處理,不會出現莫名其妙的輸出結果。
4.效率與低存儲量需求。效率是指算法的執行時間。存儲量需求是指算法執行過程所須要的最大的存儲容量。效率和低存儲量二者一般狀況下是矛盾的,二者都與問題的規模有關,須要設計人員進行權衡。

4.算法分析

算法分析主要是指斷定算法的優劣,判斷一個算法的好壞通常從兩個方面考慮,即時間角度和空間角度。評價一個算法性能的好壞,實際上就是評價算法的資源佔用問題。通常算法分析從時間角度考慮的較多。

1>分析方法

度量一個程序的執行時間一般有兩種方法,分別是過後統計方法和事前分析估算的方法。

①過後統計方法

這種方法的缺點是,必須先運行依據算法編制的程序;所花時間的統計量依賴於計算機的軟硬件等環境因素,容易掩蓋算法自己的優劣。

②事前分析估算的方法

使用高級語言編寫的程序在計算機上運行時所消耗的時間取決於下列因素:
(1).算法選用的策略
(2).問題規模
(3).書寫程序的語言
(4).編譯產生的機器代碼質量
(5).機器執行指令的速度
由於計算機軟硬件的因素,可能使用上述5點來計算算法執行的時間有些不太合適,若是撇開這些因素,那麼算法的效率就依賴於問題的規模。

實踐中咱們能夠把兩種方法結合起來使用。

2>時間複雜度

通常咱們將算法的求解問題的輸入稱爲問題的規模,使用整數n表示。
在算法的每一個步驟中,可能有若干條語句,而頻度就是指每條語句的執行次數。
時間複雜度是指算法的時間耗費。

以一條基本語句的執行時間爲基本單位,該算法全部語句中總的基本語句的執行次數就是改算法的時間耗費,它是該算法求解的問題規模n的函數。當n趨向無窮大時,咱們把時間複雜度的數量階稱爲算法的漸進時間複雜度。通常咱們把漸進時間複雜度稱爲算法的時間複雜度,記做「O」(Order)。

數學定義:T(n)=O(f(n)) 當n≥n0時知足0≤T(n)≤C*f(n)

順序檢索法的時間代價老是相差很少的,不管數組中的元素是不是按照順序保存。
二分法檢索要求元素必須按從低到高的順序保存。根據二分法的使用環境,這個排序的要求可能會對時間代價產生損害,由於要保持數組的順序性,在插入新元素時會增長時間代價。

3>空間複雜度

空間複雜度(Space Complexity)相似於時間複雜度,是指該算法所耗費的存儲空間。也是問題規模n的函數。通常是指漸進空間複雜度。

數學定義:S(n)=O(T(n))

在存儲結構中,相似指針同樣的開銷其實是附加信息的開銷,稱爲結構性開銷。從理論上講,這種結構性開銷應該儘可能小,而訪問路徑又應該儘量多且有效。時間空間的權衡也正是研究數據結構的樂趣所在。

5.總結

算法分析時,除特別指明,均是按照最壞的狀況分析。咱們一般所說的算法的複雜度通常是算法的時間複雜度和空間複雜度的合稱。
最好的時間空間改進來源於好的數據結構和算法。因此解決問題的步驟應該是:先調整算法,後調整代碼。

參考文獻:《數據結構與算法分析 Java語言描述》、《數據結構與算法分析 Java語言描述第二版》、《數據結構與算法(Java語言版解密)》

下一篇:線性表(Linear List)

相關文章
相關標籤/搜索