資料結構知識點複習

2021-07-04 08:57:54 字數 4167 閱讀 6987

一、綜述:

資料結構作為軟體開發的必須基礎,不僅實用,一般找工作時也常常考到。因此寫篇文章,梳理一下資料結構這個知識點的基本框架與結構。

程式設計=資料結構+演算法

資料結構:存在特定關係的資料元素的集合

邏輯結構包含:集合結構、線性結構、樹結構和圖結構;物理結構包括順序儲存於鏈式儲存;

演算法特點:輸入輸出、有窮性、確定性、可行性;演算法設計要求:正確性、可讀性、健壯性、效率高與儲存量低。

演算法時間複雜度:是執行此次數的函式;

二、基本資料結構:

c語言陣列:屬於順序儲存,需要定義長度。如果對資料長度變化,使用時採用動態陣列進行記憶體的分配:如int *p=new int [n]; 釋放:delete p;p=null;

vector:c++裡的一種順序儲存的容器模板,使用與陣列類似,由於是模板類,包含大量的造作方法與操作成員;

當往容器中存放的元素大於容器本身所保留的空間後,vector會釋放當前的記憶體,並開闢一塊更長的記憶體位址,來存放要存入的元素。

優點:方便進行元素的查詢與修改;使用方便;

缺點:不利於插入與刪除元素,每次刪除乙個元素之後,後面的元素都需要向前移動,開銷太大。

單鏈表:c++中為slist;

雙向鍊錶:c++為queue;雙向鍊錶可以雙向進行元素查詢、刪除、插入操作。不過操作相比較複雜。

環形鍊錶::c++為list

也稱為迴圈鍊錶;將鍊錶最後乙個元素的指向指標指向第乙個元素;此時如果第乙個元素的指向指標指向它自己,那就是空鍊錶。c++中list好像就是迴圈鍊錶。

3.棧:c++為stack

一種資料結構,具有先進入後出來的操作,即元素只能從一端進入與刪除操作,這個入口稱為棧頂;可以通過順序儲存結構實現,也可以通過鏈式儲存結構實現;在實際應用中較為廣泛。如遞迴過程與求字尾表示式。

程式棧區:由編譯器自動分配與釋放,主要儲存函式的區域性變數,引數等。棧的記憶體是有限的,一般1mb到2mb,過大的棧區申請將會出錯。申請速度較快。

4.佇列:c++為queue

具有先進先出,後進後出的特點,即佇列的隊頭只能進入,隊尾只能出隊。實現形式包括順序儲存與鏈式儲存兩種形式,對於鏈式儲存,可看著只能在鍊錶的頭部插入元素,尾部刪除元素。

雙端佇列:即佇列不區分正反,兩邊都具有插入與出隊的功能,不過出隊與入隊的操作不能在同一端進行。

變種:包含所謂的出隊受限的雙端佇列和入隊受限的雙端佇列,即雙端佇列中的某一端,出隊或入隊的功能失效。

優先佇列:此佇列帶有排序功能,入隊的元素缺省會進行排序,出隊的元素是佇列中最大的那個。

5.字串:有0個或多個字元組成的有限序列;c++中為string

string字串與c語言中的字串陣列相比,string中的字元個數就是包含的字元個數,而字串陣列則要在尾部加『\0』,要多乙個字元。

string中的儲存方式可以為順序儲存於鏈式儲存,順序儲存所佔記憶體小,效能好,鏈式儲存則方便進行刪除、插入操作,c++中應該是順序儲存吧,沒查到。

6.樹:屬於非線性儲存結構,一棵樹有乙個根節點,乙個節點可以有多個子樹。,子樹之間不能連線。

樹的深度:即樹的最大層數;樹結構表示方法:可以採用單鏈表,多重鍊錶,用以表示節點指向的多個孩子節點。

節點的度:即孩子節點的個數;葉子節點:沒有孩子節點的節點。

二叉樹:所有的節點要麼為空,要麼包含兩個或乙個孩子節點,就為二叉樹。具體又分為斜二叉樹(所有的節點都只有左子樹為孩子節點)、滿二叉樹(如果節點存在子節點,左右節點都必須存在,同時所有的葉子節點都在同一層)、完全二叉樹(相比滿二叉樹,所有的葉子節點都在一層,某個節點可以乙個孩子節點,但必須是其同輩的先編號的節點都有兩個節點,且此孩子為為左子樹)

性質:i層最多2^(i-1)個節點,深度為k的二叉樹節點個數最多為2^k-1,有n個節點的完全二叉樹,深度為[log2(n)]+1;對於乙個二叉樹,終端節點數為n0,度為2的節點數為n2,則n0=n2+1;對於完全二叉樹,對對於節點i,父節點為[i/2],對於節點為i,一般左節點為2i,右節點為2i+1;

遍歷方式:包括前序遍歷、中序遍歷、後序遍歷。關鍵在於根節點的遍歷順序。

森林:由樹轉換為二叉樹:連線兄弟節點,並刪除根節點與第乙個節點之外的連線,然後旋轉;由森林轉換二叉樹:先將森林轉換為二叉樹,在分別由中間向兩邊接根節點。

應用:霍夫曼樹

二叉排序樹:

二叉堆:

程式堆區:一塊可以使用的記憶體區,由程式設計師進行申請與釋放,記憶體不是連續的,記憶體大小與計算機虛擬記憶體有關,申請讀取慢,容易產生記憶體碎片。

7.圖:元素之間的關係由一對一變為一對多。有頂點和邊組成,g(v,e)

邊無方向,稱為無向圖,邊有方向,稱為有向圖,邊帶權值,稱為網。

對於無向圖,邊數為各定點度之和的一半。對於有向圖,邊數為個頂點入度或出度的總和。

連通圖:圖中各頂點可以通過邊到達任何乙個頂點。對於有向圖:兩個定點之間一定存在通路。極小生成樹:n個頂點由n-1條邊連起來即可形成連通圖。

儲存結構:鄰接矩陣(以矩陣的方式幾下元素之間的兩兩關係,比較耗記憶體,不過容易實現),鄰接表(類似鍊錶的方式,記錄下每個元素之間的連線關係,實現比較麻煩,不過省記憶體)十字鍊錶(不是很懂,比較麻煩)邊集陣列。

最小生成樹:對於網,以n-1條邊將n個節點連起來,使得邊上的權值之和最小。基本演算法:prim普里姆演算法,kruskal克魯斯卡爾演算法;

最短路線演算法:對於網,找到從乙個節點到另乙個節點的一系列路徑,使得經過的邊的權值之和最小。基本演算法:dijstra迪傑斯特拉演算法,fiold弗洛伊德演算法。

拓撲排序與關鍵路徑演算法,還未看。

三、查詢

查詢表:表示要查詢的元素的集合。具體的形式如同一張excel;與資料庫中表的概念相同。

關鍵字:可以當做表頭,即每一項的各個屬性,其中對這個記錄具有唯一性的關鍵字(屬性)稱為主關鍵字,一般是記錄的序號,這個是唯一的,其他的是次關鍵字。

靜態查詢:(1)查詢:看有沒有(返回bool型別)(2)檢索:檢視某項的特定屬性,一般要返回的。

動態查詢:在表中查詢元素後,可以進行插入、刪除等操作。需要專門用於插入、刪除的資料結構(如二叉排序樹)。

順序查詢:採用逐個遍歷比較的方式,速度慢。

有序表查詢:往往採用半折查詢法,(二分法),演算法複雜度為o(log(n))。對其改進體現在中間位置的選擇,可以根據當前鍵值與區間的比例進行差值。

此外就是斐波那契查詢法,對中間位置改用斐波那契數列的方式得到。

(2)分塊索引:把資料分成若干塊,形成快內無序,塊間有序。同時對於塊間,後面的快的最小關鍵字要大於前面塊的最大關鍵字。然後對所有的塊建立索引表,表中每項包含所指向的塊的首位址,塊中的元素,以及最大關鍵字等。

二叉排序樹:屬於一種二叉樹結構,方便進行查詢、刪除與插入操作。對於每個非葉子節點:左子樹小於根節點,右子樹均大於根節點。關於插入操作,還是比較方便的,先定位到要插入的節點,如果當前位置的節點是葉子節點,直接在這個節點後面生產葉子節點即可;如果是非葉子節點,先先當前節點改為要插入的節點,然後將這個節點的子節點作為插入元素的子節點。

關於刪除。相對來說比較麻煩,刪除目標節點後,要在目標節點的子節點和孫子節點裡找乙個合適的元素,來作為此位置的代替者。

平衡為二叉樹:二叉樹在構建的過程中,會出現左右深度不一致的情況,而平衡二叉樹的定義則是左右子樹的高度差最多為1,就是平衡因子,即-1或0或1。因此在實現平衡二叉樹的過程中,需要不斷的計算當前的樹是否滿足平衡二叉樹的定義,如果乙個節點的平衡因子不滿足要求,如大於1,需要對這個節點以及子節點進行順時針旋轉,如果平痕因子小於零,則進行逆時針旋轉。具體還是比較麻煩的。

多路查詢樹(b樹):

(1)2-3樹:對於乙個樹結構,其節點要麼沒孩子,要麼有2個孩子(2節點)或3個孩子(3節點),稱為2-3樹。2節點只有乙個元素和兩個孩子,3節點有2個元素和3個孩子。主要包括插入與刪除操作,在這個過程總一定要是每個結點都滿足2-3樹的定義。具體的操作還是挺抽象的。

(2)2-3-4樹:與2-3樹類似,即每個結點多了乙個4節點,包括3個元素和4個孩子。

(3)b樹:對於每個結點,要麼沒孩子節點,要麼至少有2個子樹,每個結點有k-1個元素和k個孩子。且所有的葉子都位於同一層。

雜湊查詢(雜湊表)

即儲存位置是關鍵字的函式,通過對關鍵字的變換得到具體的儲存位置。 儲存位置=f(key) ,這個f稱為雜湊函式,即雜湊函式。通過雜湊表可以儲存記錄的位址,但是當兩個關鍵字相同時,位址會衝突。

為此提出了各種雜湊函式構造方法,如(1)直接定址法,f(x)-ax+b.(2)數字分析法 (3)平均取中法(4)摺疊法(5)除留餘數法(6)隨機數法

對於位址衝突的問題,採用開放定址法,再雜湊函式法,鏈位址法、公共溢位法等。

四、排序

資料結構 複習知識點彙總

1 用鍊錶表示線性表的優點是 便於插入和刪除操作 2 單鏈表中,增加頭結點的目的是 方便運算的實現 3 棧和佇列的共同特點是 只允許在端點處插入和刪除元素 4 棧通常採用的兩種儲存結構是 線性儲存結構和鍊錶儲存結構 5 佇列具有 先進先出 的特徵,棧具有 後進先出 的特徵。6 鍊錶 插入和刪除不需要...

資料結構期末複習知識點詳解

第二章 線性表 1 線性表順序儲存結構和鏈式儲存結構的特點 順序儲存時,相連資料元素的存放位址也相鄰,邏輯與物理統一 記憶體中可用的儲存單元都是連續的 優點 儲存密度大,易於查詢和修改 缺點 插入和刪除元素時不方便,儲存空間利用率低,預先分配空間可能造成浪費。鏈式儲存時,相鄰資料元素可以隨意存放,儲...

資料結構 知識點

定義 度 兒子數 分支節點 除了根和葉子的節點 根的深度為1 資料結構的分類 資料結構分為邏輯結構和物理結構。邏輯結構 表現資料之間的關係的一種資料結構,分為線性結構和非線性結構。物理結構 表現資料如何儲存的一種資料結構,通常分為順序結構 鏈式結構 索引結構和雜湊結構。有序表,也叫有序線性表,資料按...