1. 程式人生 > >資料結構複習小記1

資料結構複習小記1

  1. 資料元素是資料的基本單位
  2. 資料項是資料不可分割的最小單位。
  3. 資料結構的基本結構:集合,線性結構,樹形結構,圖(網)狀結構
  4. 邏輯結構(抽象的,與現實無關)物理結構(儲存結構)---順序儲存結構(位置相鄰),鏈式儲存結構(指標表示關係)
  5. 資料型別--抽象資料型別(ADT)=資料物件,資料關係,基本操作
  6. 演算法的特徵:有窮性,確定性,可行性,輸入,輸出
  7. 演算法的設計要求:正確性,可讀性,健壯性,效率與低儲存量
  8. 時間複雜度:演算法執行操作的時間;空間複雜度:算法佔用的儲存空間大小

線性表

  1. 線性表及其特點:線性表是n個數據元素的有限序列;特點:第一個,最後一個(有第一個元素和最後一個元素),前驅,後繼(除了第一個元素,都有前驅;除了最後一個元素,都有後繼)
  2. 順序表----線性表的順序儲存結構
  • 特點:a)邏輯上相鄰的元素在物理位置上相鄰;b)隨機訪問
  • 型別定義:‘陣列+長度’   
  • 插入移動元素:n/2    刪除移動元素:n-1/2     
  •     3. 單鏈表---鏈式儲存結構

  • 用指標表示資料之間的邏輯關係 
  • p=l->next 起始位置  p=p->date當前  p=p->next下一個 
  • 為空:p=null
  •    4.迴圈連結串列--最後一個結點的指標指向頭結點

  • 空表:L->next==L

棧和佇列

  1. 棧:先進後出,入棧(push),出棧(pop)
  2. 鏈棧:棧的鏈式儲存結構,用不帶頭結點的單鏈表實現;
  3. 順序棧:順序儲存結構
  4. 佇列:先進先出
  5. 鏈佇列:佇列空q.front==q.rear

順序表和連結串列的區分

1.存取方式:順序表可以順序存取,也可以隨機存取,連結串列只能從表頭順序存取元素。

2.邏輯結構與物理結構

  採用順序儲存是,邏輯上相鄰的元素,其對應的物理儲存位置也相鄰。採用鏈式儲存時邏輯上相鄰的元素,其物理儲存位置不一定相鄰,其邏輯關係是通過指標連結來表示的。

3.查詢,插入和刪除操作

對於按值查詢,當順序表在無序的情況下,兩者的時間複雜度為O(n);而當順序表有序時採用折半查詢O(logn)。

對於按序號查詢,順序表支援隨機訪問,時間複雜度為O(1),連結串列的平均複雜度為O(n).順序表的插入,刪除操作,平均需要移動半個表長的元素。連結串列的插入,刪除操作只需要修改相關結點的指標域。由於連結串列每個結點帶有指標域,因而在儲存空間上比順序儲存需較大的代價,儲存密度不夠大。

4.   空間分配

順序儲存在靜態儲存分配情況下,一旦儲存空間裝滿就不能擴充,會溢位;動態儲存分配的儲存空間可以擴充,需要移動大量元素,操作效率降低,而且若記憶體中沒有更大塊的連續儲存空間將導致分配失敗。

實際中選取儲存結構

1.基於儲存的考慮

 對線性表的長度或儲存規模難以估計時,不宜採用順序表;連結串列不用事先估計儲存規模,但連結串列的儲存密度低。

2.基於運算的考慮

經常按序號訪問資料元素,順序表優先連結串列;經常做插入,刪除操作時,連結串列優先於順序表。

3.基於環境考慮

順序表容易實現,任何高階語言中都有陣列型別,連結串列操作基於指標。

出棧公式次數:1/(n+1) (2n)!/(n!*n!)

隊空條件:Q.front == Q.rear == 0;

 但是隊滿條件不能是Q.rear==MaxSize,因為當front == Q.rear-1時,仍然媽祖條件,但此時隊中只有一個元素,此時入隊出現“上溢位”,但這種溢位並不是真正的溢位,這是順序佇列的缺點

3.迴圈佇列

  當隊首指標Q.front=MaxSize-1後,再前進一個位置就自動到0,這可以利用除法取餘運算(%)來實現

  初始時:Q.front=Q.rear=0

  隊首指標進1:Q.front=(Q.front+1)%MaxSize;

  隊尾指標進1:Q.rear=(Q.rear+1)%MaxSize;    

  佇列長度: (Q.rear+MaxSize - Q.front)%MaxSize;    //加上MaxSize的原因是Q.rear可能迴圈到Q.front的左邊,這時長度就是Q.rear+MaxSize - Q.front,%MaxSize的目的是Q.rear在Q.front的右邊時,加上MaxSize就不是準確值了,所以取模,而取模對前一種情況是沒有影響的

 出隊入隊時:指標都按順時針方向進1

 且隊空的條件為Q.front=Q.rear,而隊滿的條件也是Q.front=Q.rear(隊尾指標追上了隊首指標),解決方案:

    1)犧牲一個單元來區分隊空隊滿,入隊時少用一個佇列單元,這是一種較為普遍的做法,約定以“隊頭指標在隊尾指標的下一個位置作為隊滿的標誌”。

           隊滿條件:(Q.rear+1)%MaxSize==Q.front 

           隊空條件:Q.front==Q.rear

           佇列中元素的個數:(Q.rear-Q.front+MaxSize)%MaxSize

    2) 型別中增設表示元素個數的資料成員。這樣隊空的條件為Q.size == 0;隊滿的條件為Q.size==MaxSize,兩種情況都有Q.front==Q.rear

    3) 型別中增設tag資料成員,以區分堆滿還是隊空。tag等於0的情況下,若因刪除導致Q.front==Q.rear則為隊空,tag等於1的情況下,若因插入導致Q.front==Q.rear則為隊滿

棧在表示式求值中的應用

A+B*(C-B)-E/F   字尾表示式:ABCD-*+EF/

緩衝區是佇列實現的。

廣度優先搜尋圖需要佇列作為輔助儲存空間。

樹與二叉樹:

樹是n個結點的有限集合,n=0時,為空樹;

非空樹滿足:有且僅有一個特定的成為根的結點;當n>1時,

其餘結點可分為m個互不相交的有限集合,其中每個集合本身又是一顆數,稱為根結點的子樹。

樹的特點:根結點沒有前驅結點,其他結點有且只有一個前驅結點;樹中所有結點可以有零個或多個後續結點。

高度h的m叉樹至多有(m^h-1)/(m-1)個結點

二叉樹是另一種樹形結構,特點是每個結點至多隻有兩顆子樹(度不大於2),子樹有左右之分不能任意顛倒。

非空二叉樹上葉子結點數等於度為2的結點數加1

非空二叉樹上第k層上至多有2^(k-1)個結點(k>=1)。

高度為H的二叉樹至多有2^h-1個結點

結點i所在層次為(log2 i)+1

具有n個結點的完全二叉樹的高度為log2(n+1) n1=1或log2n +1(n1=0)

高度為h的完全二叉樹最少有2^(h-1)

   非空指標數=總分支數=n-1,空指標數=2*結點總數-非空指標數=2n-(n-1)=n+1

二叉樹遍歷 二叉樹為空不做操作

1.先序遍歷:根結點-先序遍歷左子樹-先序遍歷右子樹

2.中序遍歷:中序遍歷左子樹-根結點-中序遍歷右子樹

3.後續遍歷:後續遍歷左子樹-後序遍歷右子樹-根結點

可以藉助棧將二叉樹的遞迴遍歷演算法轉換為非遞迴演算法;

線索二叉樹

1.線索二叉樹是一種物理結構

2.n個結點的線索二叉樹上含有的線索數為n+1