用程式解決問題時,往往需要將具體問題抽象為數學模型,再用具體演算法進行解決,這個抽象數學模型的過程即位分析問題的過程。程式描述數學模型不再是數學方程式,而是採用資料結構。
一、資料結構的基本相關概念
什麼是資料結構?資料結構是基本元素,及其之間存在的一種或多種特定關係的集合。
根據不同的資料關係,可以採用不同的資料結構,資料關係的特性分類:
--集合:除了屬於某同一集合,並無其他特定關係;
--線性:資料之間存在一對一的關係;
--樹:資料之間存在一對多的關係;
--圖或網:資料之間存在多對多的關係;
資料型別分類:
--基本資料型別:原子型別、結構型別;原子型別是不可再分解的資料型別;
--抽象資料型別:包括:資料物件、資料關係、基本操作
--多形資料型別:指存在相同關係,但元素值得成分型別不確定;
抽象資料型別分為:
--原子型別;
--固定聚合型別:變數數目和值的成分確定;
--可變聚合型別:變數數目或值得成分不確定;
資料關係:
資料元素之間的關係計算機中有兩種不同的表示方法:順序映像和非順序映像,由此得到兩種不同的儲存結構:順序儲存和鏈式儲存。
t(n)=o(f(n))
s(n)=o(f(n))
表示演算法執行時間或空間的增長率和f(n)的增長率相同;常見的f(n)有常量階、線性階(如f(n)=n)、平方階(f(n)=n^2)、對數階(logn)、指數階(2^n)等;通常我們不希望用指數階。
三、線性結構
1、線性表
--連續儲存順序表示[原子型別陣列];
--鏈式表示:線性鍊錶(單鏈表)、迴圈鍊錶、雙向鍊錶......(結點、頭/尾結點);鍊錶採用非指標表示,而採用陣列標號的方式,稱為靜態鍊錶。
2、棧lifo
--同樣有兩種表示方式(靜態/鏈式、表尾即棧頂、棧底),典型:括號匹配、迷宮問題、算式求解等問題;
--問題簡化:如迷宮問題簡化為最簡單的場景考慮,擴充套件到整體情形;
--遞迴與迭代:自上而下/自下而上解決問題;遞迴函式:通過一系列自己呼叫自己的函式。
3、佇列fifo
--隊頭/隊尾;雙端佇列、輸出受限雙端佇列(兩端輸入一端輸出)、輸入受限雙端佇列(兩端輸出一端輸入);
--迴圈佇列:典型共享buffer/讀寫指標方式;
4、串
--字串:是由零個或多個字元組成的有限序列;
--連續儲存: 定長順序儲存、堆分配儲存、鏈式儲存、塊鏈式儲存(差別:結點裡儲存多個字元);
--模式匹配的優化演算法kmp;
5、廣義陣列和廣義表
--十字鍊錶:需要標誌位標誌原子或子表;
四、樹結構
--基本定義:根、子樹、葉子、孩子、兄弟、雙親... ...數的集合叫森林、層次;
--有序樹:各個子樹叢左到右有次序,不能互換的樹,否則為無序樹;
--樹的儲存法:(陣列+index、鍊錶)雙親表示法,孩子表示法,孩子兄弟表示法;
二叉樹
--每個節點最多只有兩個子樹;
--順序表示:按照次序:從上至下、從左至右連續空間儲存;
--鏈式表示:鍊錶方式
--遍歷二叉樹:先序、中序、後序(樹根的順序不同:根->左->右;左->根->右;左->右->根);
--線索二叉樹:帶有"線索標誌"如果左孩子沒有,指向其前驅;右孩子沒有,指向其後繼;
最優二叉樹(huffman樹)
--樹的長度(根到每個節點的路徑和,路徑長度:根到結點分支數目和)最短的樹(結點權重*結點深度);
--huffman編碼:概率越大路徑越短;(試探/回溯=>遞迴)
平衡二叉樹(balancedbinary tree 或 heigh-balanced tree)
--所有結點的平衡因子(bf:balancefactor)為-1、0和1;
--結點的平衡因子的定義:結點的左子樹的深度減去右子樹的深度;
五、圖結構
基本定義:
每個元素為頂點;有向圖:弧、起始點為弧尾,終點為弧頭;有向圖與無向圖,有向完全圖;稀疏圖與稠密圖;子圖;無向圖連線的兩個頂點互為鄰接點;弧/邊上的數稱為權;相關的邊為度(入度/出度);
最後乙個頂點和第乙個頂點相同的路徑稱為迴路或環;頂點不重複出現的路徑為簡單路徑;除了第乙個頂點和最後乙個頂點其他都不相同的迴路稱為簡單迴路或簡單環。
任意頂點都有路徑,則這兩個頂點是連通的;任意兩點都連通的圖叫連通圖;非連通圖有多個連通分量,連通分量是無向圖中的極大連通分量。有向圖中相應稱為強連通圖和強連通分量。
生成樹是乙個極小的連通子圖,包含圖中的所有頂點,但足以構成一顆樹含(n-1)條邊。
圖的儲存結構:
--陣列表示法/矩陣;
--鄰接表:以各個頂點為頭結點的單鏈表組成;
--十字鍊錶:有向圖,鄰接表加逆鄰接表;乙個結點包含鄰接表和逆鄰接表兩個鍊錶;
--鄰接多重表:類似十字鍊錶,每個節點表示邊的資訊,分別儲存該節點相關的兩個頂點各自的下個相關的邊的資訊;
圖的遍歷:深度優先與廣度有先
最小生成樹(帶邊權值求和最小的樹):prim及kruskal,兩種演算法差別:prim採用已經在生成樹中的頂點尋找下一條邊,而kruskal一直取最小邊來判斷;
拓撲排序/關鍵路徑(基於有向無環圖)
--拓撲排序,aov(activity on vertex network頂點表示活動,而弧表示優先關係的有向無環圖)。處理在有向圖中選乙個沒有入度的頂點輸出,從圖中刪除所有以此頂點為尾的弧;
--關鍵路徑(critical path),aoe(activity on edge)即邊表示活動的網路。aoe網是乙個邊帶權值的有向無環圖,aoe網可以用來估算工程耗費的時間。零入度的頂點叫源點,出度為零的頂點叫匯點。零點到匯點之間的最長路徑叫關鍵路徑。因此非關鍵活動並不能加快工程進度。
最短路徑問題
--某一源點到其他終點的最短路徑;(dijkstra演算法,按路徑長度遞增)。
--每一頂點之間的最短路徑;(重複執行dijkstra 多次/floyd演算法,不停迭代n^3... ...);
六、動態記憶體管理
基本概念
--已經分配給使用者使用記憶體稱為"占用塊";未曾分為使用者使用的記憶體塊"空閒塊"或"可利用空間塊";
--記錄"空閒塊"鏈式結構的可利用空間表;
--可利用空間表根據不同分配方式的三種結構形式:1、固定相同儲存空間大小;2、受限可變(即存在多種固定的大小);3、完全不固定大小可變;[儲存塊與儲存池]
--分配演算法:首次擬合法、最佳擬合法、最差擬合法;
邊界標識法
--在每個儲存空間的頭部和尾部增加標識資訊,表識當前塊資訊、鍊錶資訊以及是否使用;
--相鄰儲存區域連續都不使用的時刻可以進行合併;
--迴圈鍊錶法可以沒有固定的煉表頭,依據不同的分配演算法;
夥伴系統
--空間大小為2^k次方,當需要分配的空間沒有空閒表時,可以從大的空間拆分得來,m類空間大小,需要m可用空間鍊錶指標,記憶體塊帶有標識頭資訊;
--只有互為夥伴的(即從一塊記憶體分配出來的)記憶體才可以在釋放的時候合併,亦即連續空間不一定可以做合併;
--優點:簡單、速度快;缺點:容易產生記憶體碎片;
無用單元收集兩個途徑
--引用(使用)記數器:只有當記數器值為0時,才可以釋放該空間;
--直到可利用空間表為空時,中斷程式執行,將所有未使用的空間重新鏈結成新的可使用空間表;
儲存壓縮
可用空間表為連續儲存空間(堆?);對於釋放出空間碎片需要進行儲存壓縮,一般兩種方式:
--一旦使用者釋放即可進行壓縮;
--指示可用空間指標一直往上增加,只有沒有剩餘可用空間時再進行壓縮。
資料結構基礎
資料結構定義 定義 一 資料元素集合 也可稱資料物件 中各元素的關係。定義 二 相互之間存在特定關係的資料元素集合。資料結構的種類 1 集合 2 線性結構 3 樹形結構 4 圖狀結構 或網狀結構 資料結構的形式定義 資料結構名稱 d,s 其中d為資料元素的有限集,s是d上關係的有限集 邏輯結構 資料...
基礎資料結構
1 雙鏈表。下面是c 版本的實現。include stdafx.h include 結構體 typedef struct nodedlink 初始化 void dlist dlink dl 求長度 int dlength dlink dl return i 查詢 dlink dsearch dlin...
資料結構基礎
邏輯結構 描述資料元素之間的邏輯關係。物理結構 資料結構在計算機中的表示 映像 又稱儲存結構。它包含資料元素的表示和關係的表示。用乙個可以由若干位組合形成的乙個位串表示乙個資料元素,稱這個位串為元素或節點。當資料元素由若干資料項組成時,位串中對應於各個資料項的子位串稱為資料域。資料元素之間的關係在計...