数据结构学习笔记.docx

上传人:b****7 文档编号:23863847 上传时间:2023-05-21 格式:DOCX 页数:30 大小:39.40KB
下载 相关 举报
数据结构学习笔记.docx_第1页
第1页 / 共30页
数据结构学习笔记.docx_第2页
第2页 / 共30页
数据结构学习笔记.docx_第3页
第3页 / 共30页
数据结构学习笔记.docx_第4页
第4页 / 共30页
数据结构学习笔记.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

数据结构学习笔记.docx

《数据结构学习笔记.docx》由会员分享,可在线阅读,更多相关《数据结构学习笔记.docx(30页珍藏版)》请在冰豆网上搜索。

数据结构学习笔记.docx

数据结构学习笔记

第1章緒論

1.1數據結構

1.1.1學習數據結構的必要性

《數據結構》這門課程的目的有三個.

1.是講授常用的數據結構,這些數據結構形成了程序員基本數據結構工具箱.對於許多常見的問題,工具箱里的數據結構是理想的選擇;

2.是講授常用的算法,這和數據結構一樣,是人們在長期實踐過程中的總結,程序員可以直接拿來或經過少許的修改就可以使用.可以通過算法訓練來提高程序設計水平;

3.目的是通過程序設計的技能訓練促進程序員綜合能力的提高.

1.1.2基本概念和術語

1.數據:

外部世界信息的載體,它能夠被計算機識別、存儲和加工處理,是計算機程序加工的原料;

2.數據元素(DataElement)和數據項(DataItem)

數據元素:

數據的基本單位,在計算機程序中通常被作為一個整體進行考慮和處理;

數據項:

不可分割的、含有獨立意義的最小數據單位,數據項有時也稱為字段或域;

3.數據對象(DataObject):

性質相同的數據元素的集合,是數據的一個子集;

4.數據類型(DataType):

是高級程序設計語言中的概念,是數據的取值範圍和對數據進行操作的總和.

5.數據結構(DataStructure):

是相互之間存在一種或多種特定關係的數據元素的集合.

根據數據元素之間關係的不同特性,通常有4類基本數據結構:

(1)集合(Set)

(2)線性結構(LinearStructure)

(3)樹形結構(TreeStructure)

(4)圖狀結構(GraphicStructure)

數據結構包括數據的邏輯結構和物理結構.

數據的邏輯結構(LogicStructure):

是從具體問題抽象出來的數學模型,是爲了討論問題的方便,與數據在計算機中的具體存儲沒有關係.

數據的物理結構(PhysicalStructure):

又稱為存儲結構(StorageStructure),是數據在計算機中的表示(又叫映像)和存儲,包括數據元素的表示和存儲以及數據元素之間關係的表示和存儲.

數據的存儲結構包括:

順序存儲結構和鏈式存儲結構兩種.

順序存儲結構(SequenceStorageStructure)是通過數據元素在計算機存儲器中的相對位置來表示出數據元素的邏輯關係,一版把邏輯上相鄰的數據元素存儲在屋裡位置相鄰的存儲單元中.

鏈式存儲結構(LinkedStorageStructure)對邏輯上相鄰的數據元素不要求其存儲位置必須相鄰.鏈式存儲結構中的數據元素稱為節點(Node),在節點中附設地址域(AddressDomain)來存儲于該節點相鄰的節點的地址來實現節點間的邏輯關係.

這個地址稱為引用(Reference),這個地址域被稱為引用域(ReferenceDomain).

1.2算法

1.2.1算法的特性

算法(Algorithm)是對某一特定類型的問題的求解步驟的一種描述,是指令的有限序列.一個算法應該具備以下5個特性:

1.有窮性(Finite):

一個算法總是在又窮步之後結束.

2.確定性(Unambiguous):

算法的每一個步驟都必須有確切的含義,即無二義,並且對於相同的輸出只能有相同的輸出.

3.輸入(Input):

4.輸出(Output):

5.能行性(Realizability):

算法中的每一步都可以通過已經實現的基本運算的有限次運行來實現.

1.2.2算法的評價標準

評價一個算法優劣的主要標準如下:

1.正確性(Correctness)

2.可讀性(Readability)

3.健壯性(Robustness)

4.運行時間(RunningTime)

5.佔用空間(StorageSpace):

指算法在計算機上存儲所佔用的存儲空間,包括存儲算法本身所佔用的存儲空間、算法的輸入及輸出數據所佔用的存儲空間和算法在運行過程中臨時佔用的存儲空間.

通常把算法在運行過程中臨時佔用的存儲空間的大小叫算法的空間複雜度(SpaceComplexity).

1.2.3算法的時間複雜度

一個算法的時間複雜度(TimeComplexity)是指該算法的運行時間與問題規模的對應關係.一個算法是由控制結構和原操作構成的,其執行的時間取決於二者的綜合效果.爲了便於比較同意問題的不同算法,通常把算法中基本操作重複執行的次數(頻度)作為算法的時間複雜度.算法中的基本操作一般是指算法中最深層循環內的語句.因此,算法中基本操作語句的頻度是問題規模n的某個函數f(n),記做:

T(n)=o(f(n)).

1.4.2泛型編程

第2章線性表

線性表是線性結構的抽象(Abstract),線性結構的特點是結構中的數據元素之間存在一對一的線性關係.

2.1線性表的邏輯結構

線性表(List)是由n(n≥0)個相同類型的數據元素構成的有限序列.

2.2順序表

在計算機內,保存線性表最簡單、最自然的方式,就是把裱中的元素一個接一個地放進順序的存儲單元,這就是線性表的順序存儲(SequenceStorage).

線性表的順序存儲是指在內存中用一塊連續的空間依次存放線性表的數據元素,用這種方式存儲的線性表叫順序表(SequenceList).

2.3單鏈表

線性表的另外一種存儲結構---鏈式存儲(LinkedStorage),這樣的線性表叫鏈表(LinkedList)

2.3.1單鏈表的定義

鏈表是用一組任意的存儲單元來存儲線性表中的數據元素(這組存儲單元可以是連續的,也可以使不連續的).那麼,怎麼表示兩個數據元素邏輯上的相鄰關係呢?

即如何表示數據元素之間的線性關係呢?

為此,在存儲數據元素時,除了存儲數據元素本身的信息外,還要存儲與它相鄰的數據元素的存儲地址信息.這兩部份信息組成該數據元素的存儲映像(Image),稱為節點(Node).把存儲數據元素本身信息的域叫節點的數據域(DataDomain),把存儲與它相鄰的數據元素的存儲地址信息的域叫節點的引用域(ReferenceDomain).因此,線性表通過每個節點的引用域形成了一根”鏈條”,這就是”鏈表”名稱的由來.

如果結點的引用域只存儲該節點的直接後繼結點的存儲地址,則該鏈表叫單鏈表(SinglyLinkedList).把該引用域叫next.

data

next

2.4其他鏈表

2.4.1雙向鏈表

2.4.2循環鏈表

第3章棧和隊列

棧和隊列也是線性結構,線性表、棧和隊列這三種數據結構的數據元素以及數據元素間的邏輯關係完全相同.

3.1棧

棧(Stack)是操作限定在表的尾端進行的線性表.

3.1.2棧的存儲和運算實現

1.順序棧

用一片連續的存儲空間來存儲棧中的數據元素,這樣的棧稱為順序棧(SequenceStack).

2.鏈棧

棧的另外一種存儲方式是鏈式存儲,這樣的棧稱為鏈棧(LinkedStack).鏈棧通常用單鏈表來表示,它的實現是單鏈表的簡化.

3.2隊列

3.2.1隊列的定義及基本運算

隊列(Queue)是插入操作限定在表的尾部而其他操作限定在表的頭部進行的線性表.把進行插入操作的表位稱為隊尾(Rear),把進行其他操作的頭部稱為對頭(Front).檔隊列中沒有數據元素時成為空隊列(EmptyQueue).

3.2.2隊列的存儲和運算實現

1.順序隊列:

用一片連續的存儲空間來存儲隊列中的數據元素,這樣的隊列稱為順序隊列(SequenceQueue).

解決假溢出的方法是將順序隊列看成是首尾相接的循環結構,頭尾指示器的關係不變,這種隊列叫循環順序隊列(CircularSequenceQueue)

2.鏈隊列:

隊列的另外一種存儲方式是鏈式存儲,這樣的隊列稱為鏈式隊列(LinkedQueue).

第4章串和數組

4.1串

字符串簡稱串,是一種特殊的線性表,其特殊性在於串中的數據元素是一個個的字符.

4.1.1串的基本概念

4.1.2串的存儲及類定義

由於串中的字符都是連續存儲的,而在C#中串具有恒定不變的特性,即字符串一經創建,就不能將其變長、變短或者改變其中任何的字符.

4.2數組

數組可以看做是線性表的推廣.數組作為一種數據結構,其特點是結構中的數據元素可以使具有某種結構的數據,甚至可以是數組,但屬於同一數據類型.

4.2.1數組的邏輯結構

數組是n(n≥1)個相同數據類型的數據元素的有限序列.一堆數組可以看做是一個線性表,二維數組可以看做是”數據元素是一維數組”的一維數組,三維數組可以看做是”數據元素是二維數組”的一維數組.

通常,一個數組已經定義,每一維的大小及上下皆都不能改變.所以,在數組上不能進行插入、刪除數據元素等操作.數組上的操作一般有:

1.取值操作;

2.賦值操作;

3.清空操作;

4.賦值操作;

5.排序操作;

6.反轉操作;

4.2.2數組的內存映像

通常,採用順序存儲結構來存儲數組中的數據元素,因為數組中的元素要求連續存放.

對於多維數組,需要把多為數組的下標表達式轉換成一維的下標表達式.當行列固定后,要用一組連續的存儲單元存放數組中的元素,有一個次序約定問題,這產生了兩種存儲方式:

一種是以行序為主序(線性後列)的順序存放,另一種是以列序位主序(先列後行)的順序存放.

第5章樹和二叉樹

5.1樹

5.1.1樹的定義

樹(Tree)是n(n≥0)個相同類型的數據元素的有限集合.書中的數據元素叫節點(Node).n=0的樹稱為空樹(EmptyTree);對於n>0的任意非空樹T有:

(1)有且僅有一個特殊的節點稱為樹的根(Root)節點,根沒有前驅節點;

(2)若n>1,則除根節點外,其餘節點被分成了m(m>0)個互不交互的集合T1,T2,…,Tm,其中每一個集合Ti(1≤i≤m)本身又是一棵樹.樹T1,T2,…,Tm稱為這棵樹的子樹(Subtree).

5.1.2樹的相關術語

1.節點(Node):

表示樹中的數據元素,由數據項和數據元素之間的關係組成.

2.節點的度(DegreeofNode):

節點所擁有的子樹的個數.

3.樹的度(DegreeofTree):

樹中各節點度的最大值.

4.葉子節點(LeafNode):

度為0的節點,也叫終端節點.

5.分支節點(BranchNode):

度不為0的節點,也叫非終端節點或內部節點.

6.孩子(Child):

節點子樹的根.

7.雙親(Parent):

節點的上層節點叫該節點的雙親.

8.祖先(Ancestor):

從根到該節點所經分支上的所有節點.

9.子孫(Descendant):

以某節點為根的子樹中的任一節點.

10.兄弟(Brother):

同一雙親的孩子.

11.節點的層次(LevelofNode):

從根節點到樹中某節點所經路徑上的分支數稱為該節點的層次.根節點的層次規定為1.

12.堂兄弟(Sibling):

同一層的雙親不同的節點.

13.樹的深度(DepthofTree):

樹中節點的最大層次數.

14.無序樹(UnorderedTree):

樹中任意一個節點的各孩子節點之間的次序構成無關緊要的樹.

15.有序樹(OrderedTree):

樹中任意一個節點的各孩子節點有嚴格排列次序的樹.

16.森林(Forest):

m(m≥0)棵樹的集合.

5.1.3樹的邏輯表示

1.直觀表示法

2.凹入表示法:

每個節點對應一個矩形,所有節點的矩形都右對齊,根節點用最長的矩形表示,同一層的節點的矩形長度相同,層次越高,矩形長度越短.

3.廣義表表示法:

用一對圓括號把它的子樹節點括起來,子樹節點用逗號隔開.

4.嵌套表示法:

類似數學中所說的文氏圖標示法.

5.1.4樹的基本操作

5.2二叉樹

5.2.1二叉樹的定義

二叉樹(BinaryTree)是n(n≥0)個相同類型的節點的有限集合.n=0的二叉樹稱為空二叉樹(EmptyBinaryTree);對於n>0的任意非空二叉樹有:

1.有且僅有一個特殊的節點稱為二叉樹的根(Root)節點,根沒有前驅節點;

2.若n>1,則除根節點外,其餘節點被分成了2個互不相交的集合TL,TR,而TL,TR本身又是一棵二叉樹,分別稱為這兩棵二叉樹的左子樹(LeftSubtree)和右子樹(RightSubtree).

兩種特殊的二叉樹:

1.滿二叉樹(FullBinaryTree):

如果一棵二叉樹只有度為0的節點和度為2的節點,並且度為0的節點在同一層上,則這棵二叉樹為滿二叉樹.由定義可知,對於深度為k的滿二叉樹的節點個數為2k-1.

2.完全二叉樹(CompleteBinaryTree):

深度為k,有n個節點的二叉樹當且僅當其每一個節點都與深度為k,有n個節點的滿二叉樹中編號從1到n的節點一一對應時,稱為完全二叉樹.

完全二叉樹的特點是葉子節點只可能出現在層次最大的兩層上,並且某個節點的左分支下的子孫的最大層次與右分支下的子孫的最大層次相等或大於1.

5.2.2二叉樹的性質

性質1一顆非空二叉樹的第i層上最多有2i-1個節點(i≥1).

性質2若規定空樹的深度為0,則深度為k的二叉樹最多有2k-1個節點(k≥0).

性質3具有n個節點的完全二叉樹的深度k為log2n+1.

性質4對於一顆非空二叉樹,如果度為0的節點數目為n0,度為2的節點數目為n2,則有n0=n2+1.

性質5對於具有n個節點的完全二叉樹,如果按照從上到下和從左到右的順序對所有節點從1開始編號,則對於序號為i的節點,有:

(1)如果i>1,則序號為i的節點的雙親節點的序號為i/2(“/”表示整除);如果i=1,則該節點是根節點,無雙親節點.

(2)如果2i≤n,則該節點的做孩子節點的序號為2i;若2i>n,則該節點無左孩子.

(3)如果2i+1≤n,則該節點的右孩子節點的序號為2i+1;若2i+1>n,則該節點無右孩子.

5.2.3二叉樹的存儲結構

二叉樹的存儲結構主要有三種:

順序存儲結構、二叉鏈表存儲結構和三叉鏈表存儲結構.

1.二叉樹的順序存儲結構

對於一棵完全二叉樹,由性質5可計算得到任意節點i的雙親節點序號、左孩子節點序號和右孩子節點序號.所以,完全二叉樹的節點棵按從上到下和從左到有的順序存儲在一維數組中.

2.二叉樹的二叉鏈表存儲結構

二叉樹的二叉鏈表存儲結構是指二叉樹的節點有三個域:

一個數據域和兩個引用域,數據域存儲數據,兩個引用域分別存放其左、右孩子的地址.當左孩子或右孩子不存在時,相應域為空,用符號NULL或∧表示.

lChild

data

rChild

3.二叉樹的三叉鏈表存儲結構

二叉樹的三叉鏈表存儲結構是指二叉樹的節點有四個域:

一個數據域和三個引用域,數據域存儲數據,三個引用域分別存放其左、右孩子節點和雙親節點的地址.當左、右孩子或雙親節點不存在時,相應域為空,用符號NULL或∧表示.

lChild

data

rChild

parent

5.2.5二叉樹的遍歷

二叉樹的遍歷是指按照某種順序訪問二叉樹中的每個節點,使每個節點被訪問一次且僅一次.遍歷是將二叉樹中的節點信息由非線性排列變為某種意義上的線性排列.也就是說遍歷操作使非線性結構線性化.

規定D、L、R分別代表遍歷根節點、遍歷左子樹、遍歷右子樹,我們討論三種方式:

DLR(先序遍歷)、LDR(中序遍歷)和LRD(後序遍歷).

除了這三種遍歷方式外,還有一種方式:

層序遍歷(LevelOrder).層序遍歷是從根節點開始,按照從上到下、從左到右的順序依次訪問每個節點一次僅一次.

1.先序遍歷(DLR)

線序遍歷的基本思想是:

首先訪問根節點,然後先序遍歷其左子樹,最後先序遍歷其右子樹.

2.中序遍歷(LDR)

中序遍歷的基本思想是:

首先中序遍歷根節點的左子樹,然後訪問根節點,最後中序遍歷其右子樹.

3.後序遍歷(LRD)

後續遍歷的基本思想是:

首先後序遍歷根節點的左子樹,然後後續遍歷根節點的右子樹,最後訪問根節點.

4.層序遍歷(LevelOrder)

層序遍歷的基本思想是:

由於層序遍歷節點的順序是先遇到的節點優先訪問,與隊列操作的順序相同.所以,在進行層序遍歷時,設置一個隊列,將根節點引用入隊,當隊列非空時,循環執行以下三步:

(1)從隊列中取出一個節點引用,并訪問該節點;

(2)若該節點的左子樹非空,將該節點的左子樹引用入隊;

(3)若該節點的右子樹非空,將該節點的右子樹引用入隊;

5.3樹與森林

5.3.1樹的存儲

1.雙親表示法

樹中的節點除了保存節點本身的信息之外,還要存儲其雙親節點在數組中的位置(數組的序號),樹的這種表示法稱為雙親表示法.

data

pPos

2.孩子鏈表表示法

孩子鏈表表示法也是用一維數組來存儲樹中各節點的信息.但節點的結構與雙親表示法中節點的結構不同,孩子鏈表表示法中的節點除保存本身的信息外,不是保存其雙親節點在數組中的序號,而是保存一個鏈表的第一個節點的地址信息.這個鏈表是由該節點的所有孩子節點組成.每個孩子節點保存有兩個信息,一個是每個孩子節點在一位數組中的序號,另一個是下一個孩子節點的地址信息.

孩子節點的結構:

index

nextChild

樹的孩子鏈表表示法的節點的結構:

data

firstChild

樹的孩子鏈表表示法對於實現查找孩子節點等操作非常方便,但對於實現查找雙親節點、兄弟節點等操作則比較困難.

3.孩子兄弟表示法

這是一種常用的數據結構,又稱二叉樹表示法,或二叉鏈表表示法,即以二叉鏈表作為樹的存儲結構.每個節點除存儲本身的信息外,還有兩個引用域分別存儲該節點第一個孩子的地址信息和下一個兄弟的地址信息.

樹的孩子兄弟表示法的節點的結構:

firstChild

data

nextSibling

5.3.2樹、森林與二叉樹的轉換

藉助二叉鏈表,樹和二叉樹可以相互進行轉換.從物理結構來看,它們的二叉鏈表是相同的,只是解釋不同而已.並且,如果設定一定的規則,就可用二叉樹來表示森林,森林和二叉樹也可以相互進行轉換.

1.樹轉換為二叉樹

將樹轉換成二叉樹的步驟是:

(1)加線.在所有兄弟節點直接加一條連線;

(2)抹線.就是對樹中的每個節點,只保留他與第一個孩子節點之間的連線,刪除其它與孩子節點之間的連線;

(3)旋轉.就是以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之層次分明.

2.森林轉換為二叉樹

森林是由若干棵樹組成,可以將森林中的每棵樹的根節點看做是兄弟,由於每棵樹都可以轉換為二叉樹,所以森林也可以轉換為二叉樹.

將森林轉換為二叉樹的步驟是:

(1)先把每棵樹轉換為二叉樹;

(2)第一棵二叉樹不動,從第二棵二叉樹開始,依次把後一棵二叉樹的根節點作為前一棵二叉樹的根節點的右孩子節點,用線連接起來.當所有的二叉樹連接起來后得到的二叉樹就是由森林轉換得到的二叉樹.

3.二叉樹轉換為樹

(1)若某節點的左孩子節點存在,將左孩子節點的右孩子節點、右孩子節點的右孩子節點….都作為該節點的孩子節點,將該節點與這些右孩子節點用線連接起來;

(2)刪除原二叉樹中所有節點與其右孩子節點的連線;

(3)整理

(1)和

(2)兩步得到的樹,使之結構層次分明;

4.二叉樹轉換為森林

(1)先把每個節點與右孩子節點的連線刪除,得到分離的二叉樹;

(2)把分離后的每顆二叉樹轉換為樹;

(3)整理第

(2)步得到的樹,使之規範,這樣得到森林.

5.3.3樹和森林的遍歷

1.樹的遍歷

樹的遍歷通常有兩種方式.

(1)先序遍歷,即先訪問樹的根節點,然後一次先序遍歷樹中的每棵子樹;

(2)後序遍歷,即先一次後序遍歷樹中的每棵子樹,然後訪問根節點.

2.森林的遍歷

森林的遍歷有兩種方式.

(1)先序遍歷,即先訪問森林中第一棵樹的根節點,然後先序遍歷第一棵樹中的每棵子樹,最後先序遍歷除第一棵樹之後剩餘的子樹森林.

(2)中序遍歷,即先中序遍歷森林中第一棵樹的根節點的所有子樹,然後訪問第一棵樹的根節點,最後中序遍歷除第一棵樹之後剩餘的子樹森林.

5.4哈弗曼樹

首先給出定義哈弗曼樹所需要用到的介個基本概念.

1.路徑(Path):

從書中的一個節點到另一個節點之間的分支構成這兩個節點間的路徑.

2.路徑長度(PathLength):

路徑上的分指數.

3.樹的路徑長度(PathLengthofTree):

從樹的根節點到每個節點的路徑長度之和.在節點數目相同的二叉樹中,完全二叉樹的路徑長度最短.

4.節點的權(WeightofNode):

在一些應用中,賦予樹中節點的一個有實際意義的數.

5.節點的帶權路徑長度(WeightPathLengthofNode):

從該節點到樹的根節點的路徑長度與該節點的權的乘積.

6.樹的帶權路徑長度(WPL):

樹中所有葉子節點的帶權路徑長度之和.

哈弗曼樹(HuffmanTree),又叫最優二叉樹,指的是對於一組具有確定權值的葉子節點的具有最小帶權路徑長度的二叉樹.

哈弗曼算法:

1.根據給定的n個權值{w1,w2,…wn},構造n棵只有根節點的二叉樹集合F={T1,T2,…,Tn};

2.從集合F中選取兩棵根節點的權最小的二叉樹作為左右子樹,構造一棵新的二叉樹,且知新的二叉樹的根節點的權值為其左、右子樹根節點權值之和;

3.在集合F中刪除這兩棵樹,并把新得到的二叉樹加入到集合F中;

4.重複上述步驟,知道集合中只有一棵二叉樹為止,這可二叉樹就是哈弗曼樹.

5.4.2哈弗曼樹類的實現

哈弗曼樹節點的結構為:

weight

Child

rChild

parent

5.4.3哈弗曼編碼

設需要編碼的字符集為{d1,d2,…,dn},各個字符在電文中出現的次數或頻率集合為{w1,w2,…,wn}.以d1,d2,…,dn作為葉子節點以w1,w2,…,wn作為相應葉子節點的權值來構造一棵哈弗曼樹.規定哈弗曼樹的左分支代表0,右分支代表1,則從根節點到葉子節點所經過的路徑分支組成的0和1的序列變為該節點對應字符的編碼,就是哈弗曼編碼.

第六章圖

6.1圖的基本概念

6.1.1圖的定義

圖(Graph)是由非空的頂點(Vertex)集合為描述頂點之間的關係—邊(Edge)或弧(Arc)的集合組成.其形式化定義為:

G=(V,E)

V={vi|vi∈某個數據元素集合}

E={(vi,vj)|vi,vj∈V∧P(vi,vj)}或E={|vi,vj∈V∧P(vi,vj)}

6.1.2圖的基本術語

1.無向圖:

在一個圖中,如果任意兩個頂點vi和vj構成的偶對(vi,vj)∈E是無序的,即頂點之間的連線沒有方向,則稱為無向圖(UndirectedGraph).

2.有向圖:

在一個圖中,如果任意兩個頂點vi和vj構成的偶對∈E是有序的,即定點見的連線游方向,則該圖為有向圖(DirectedGraph

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1