1. 程式人生 > >資料結構的一些概念與基礎知識

資料結構的一些概念與基礎知識

資料結構是用來研究非數值計算的程式設計問題中計算機的操作物件以及它們之間的關係和操作。

一些基本概念:

  1. 資料是指所有能被計算機識別、儲存和處理的符號的集合(包括數字、字元、聲音、影象等資訊)。
  2. 資料元素是資料的基本單位,具有完整確定的實際意義(又稱元素、結點、頂點、記錄等),具有若干個資料項。
  3. 資料項是構成資料元素的專案,是具有獨立意義的不可分割的最小標識單位(又稱欄位、域、屬性等)。
  4. 資料的邏輯結構是根據資料元素之間的不同邏輯關係的特性,可分為四類:(1)、集合:資料元素之間除了“同屬一個集合”的關係外,沒有其他聯絡。(2)、線性結構:一對一的關係(像線性表、棧、佇列、串都是,至於陣列和廣義表算是一種特殊的線性表,也是線性結構)。(3)、樹形結構
    :一對多的關係()。(4)、圖狀或網狀結構:多對多的關係。
  5. 資料的物理結構又稱儲存結構,是資料的邏輯結構在計算機儲存器內的表示(或映像),依賴與計算機。儲存結構可分為四類:順序、鏈式、索引和雜湊。
  6. 資料的運算是在資料的邏輯結構上定義、在資料的儲存結構上實現的操作演算法。最常用的資料運算有:插入、刪除、修改、查詢和排序。
  7. 資料元素之間的關係在計算機中有兩種不同的表示方法:順序映像和非順序映像,並由此得到兩種儲存結構:順序儲存結構和鏈式儲存結構。順序映像的特點是藉助元素在儲存器中的相對位置來表示資料元素之間的邏輯關係;非順序映像的特點是藉助指示元素儲存地址的指標表示資料元素之間的邏輯關係。任何一個演算法的設計取決於選定的資料(邏輯)結構,而演算法的實現依賴於採用的儲存結構。
  8. 資料型別:是一個值的集合和定義在這個值集上的一組操作的總稱。
  9. 抽象資料型別:由使用者定義,用以表示應用問題的資料模型。它由基本的資料型別構成,幷包括一組相關的服務(或稱操作),它與資料型別實質上是一個概念,但其特徵是使用與實現分離,實行封裝和資訊隱蔽(獨立於計算機)。

一般分為如下:

 

一些常用的預定義變數和型別:

#define TRUE 	1
#define FALSE	0    
#define OK	1
#define ERROR	0
#define INFEASIBLE	-1    //表示程式出錯,執行終止。
#define OVERFLOW	-2 

typedef int Status	//Status 表示函式的型別 
typedef int ElemType    //表示資料型別

演算法是解決某一特定型別問題的有限運算序列,是一系列轉換為輸出的計算步驟。關於演算法和演算法分析:

  1. 演算法:五個特性:1)有窮性:演算法可在一定時間內完成的。2)確定性:演算法每條都需要有明確的含義,不能產生二義性。3)可行性:演算法是可被執行的。4)輸入。5)輸出
  2. 對演算法設計的要求(應儘量滿足):1)正確性,包含程式沒有語法錯誤、程式對於輸入幾組資料能得到滿足問題需求的結果、程式對於輸入幾組典型的、有刁難性的資料能夠得到滿足問題需求的結果(一般情況下,滿足這就算合格了)、程式對一切合法的輸入都能產生滿足問題需求的結果(實現起來很困難)。 2)可讀性:方便人對演算法的理解。3)健壯性:當輸入資料非法時,演算法也可適當地作出方應和調整,不會產生莫名其妙的輸出結果。4)效率與低儲存量需求:效率指演算法執行的時間,儲存量指演算法執行過程中所需要的最大儲存空間。
  3. 時間複雜度:演算法的執行時間由演算法中所有語句的頻度(即該語句重複執行的次數)之和構成,由巢狀最深層語句的頻度決定。其按數量級遞增順序為:常量階、對數階、線性階、平方階、指數階 ,一般不希望用到指數階的演算法,運算量太大。同下邊的空間複雜度一致。
  4. 空間複雜度:原地工作:若額外空間相對於輸入資料量來說是常數,就稱演算法為原地工作。另需注意的是,若額外空間所佔空間量依賴於特定的輸入,則除特別指明外,均按最壞情況來分析。

語句的頻度指的是該語句重複執行的次數。



線性結構的特點是:

在資料元素的非空有限集中,

  1. 存在唯一一個被稱作“第一個”的資料元素。
  2. 存在唯一一個被稱作“最後一個的元素”。
  3. 除第一個外,集合中的每個資料元素均只有一個前驅。
  4. 除最後一個外,集合中的每個元素均只有一個後繼。

 

樹形結構的特點是:

  1. 是一種有層次的巢狀結構,可表示從屬關係、並列關係。
  2. 有且只有一個結點作為根,其餘結點互不相交。
  3. 樹根結點沒有前驅結點,其餘每個結點有且只有一個前驅結點。
  4. 葉子結點沒有後續結點,其餘每個結點的後續結點數可以是一個也可以是多個。

在資料結構中,有時會涉及到空間分配問題,這包含有兩個函式:malloc 和 realloc ,這兩個都在標頭檔案 stdlib.h 中。

  • malloc 函式表示動態記憶體分配,用於申請一塊連續的指定大小的記憶體塊區域以void*型別返回分配的記憶體區域地址,void* 型別表示未確定型別的指標,可以通過型別轉換強制轉換為任何其它型別的指標。一般需和free函式配對使用。
  • realloc 函式表示動態記憶體調整,用法:指標名=(資料型別*)realloc(要改變記憶體大小的指標名,新的大小)。先判斷當前的指標是否有足夠的連續空間,如果有,擴大該指標指向的地址,並且將指標返回 (假如原來的記憶體後面還有足夠多剩餘記憶體的話,realloc的記憶體=原來的記憶體+剩餘記憶體,realloc還是返回原來記憶體的地址);如果空間不夠,先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來指標所指記憶體區域(注意:原指標是自動釋放,不需要使用free),同時返回新分配的記憶體區域的首地址,即重新分配儲存器塊的地址( 假如原來的記憶體後面沒有足夠多剩餘記憶體的話,realloc將申請新的記憶體,然後把原來的記憶體資料拷貝到新記憶體裡,原來的記憶體將被free掉,realloc返回新記憶體的地址)。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。