1. 程式人生 > 其它 >資料結構學習筆記

資料結構學習筆記

本文尚在更新中


資料結構

一、資料結構緒論

1、基本概念和術語

  • 資料:是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號的集合。

  • 資料元素:是組成資料的、有一定意義的基本單位,在計算機中通常作為整體處理。也被稱為記錄。

  • 資料項:一個數據元素可以由若干個資料項組成。

    資料項是資料不可分割的最小單位。

  • 資料物件:是性質相同的資料元素的集合,是資料的子集。

    //性質相同:是指資料元素具有相同數量和型別的資料項。

    既然資料物件是資料的子集,在實際應用中,處理得資料元素通常具有相同性質,在不混淆的情況下我們習慣將資料物件簡稱為資料。

  • 資料結構:結構,簡單理解就是關係;嚴格來說是指各個組成部分的相互搭配和排列的方式。而資料結構是相互之間存在一種或多種特定關係的資料元素的集合

2、邏輯結構與物理結構

按照視點不同分類,將資料結構分為邏輯結構和物理結構。

邏輯結構

是指資料物件中資料元素之間的相互關係。分為以下四種:

  1. 集合結構:集合結構中的資料元素除了同屬於一個集合外,它們之間沒有其他關係。類似於數學中的集合。

  2. 線性結構:線性結構中的資料元素之間是一對一的關係。類似鏈式。

  3. 樹形結構:樹形結構中資料元素存在一對多的關係。

  4. 圖形結構:圖形結構中的資料元素是多對多的關係。

在使用示意圖表示資料的邏輯結構時,注意兩點:

  • 每個資料元素視為一個結點,用圓圈表示。

  • 元素之間的邏輯關係用結點之間的連線表示,如果這個關係是有方向的,那麼用帶箭頭的連線表示。

物理結構(儲存結構)

是指資料的邏輯結構在計算機中的儲存形式。

資料的儲存結構應正確反映資料元素之間的邏輯關係。而如何儲存資料元素之間的邏輯關係,是實現物理結構的重點和難點。

  1. 順序儲存結構:是把資料元素存放在地址連續的儲存單元裡,其資料間的邏輯關係和物理關係是一致的。(個人理解:類似佇列)

  2. 鏈式儲存結構:是把資料元素存放在任意的儲存單元裡,這組儲存單元可以是連續的,也可以是不連續的。資料元素的儲存關係並不能反應其邏輯關係,因此需要用一個指標存放資料元素的地址,這樣通過地址就可以找到相關聯資料元素的位置。

3、抽象資料型別

資料型別

是指一組性質相同的值的集合及定義在此集合上的一些操作的總稱。

按照取值的不同分為兩類:

  • 原子型別:是不可以再分解的基本型別,包括整型、實型、字元型等。

  • 結構型別:由若干個型別組合而成,是可以再分解的。例如陣列。

抽象資料型別

是指一個數學模型以及定義在該模型上的一組操作,體現了程式設計中問題分解、抽象和資訊隱藏的特性。

二、演算法

1、演算法效率的度量方法

效率:執行時間

事後統計方法

這種方法主要是通過設計好的程式和資料,利用計算機計時器對不同演算法編制的程式的執行時間進行比較,從而確定演算法效率的高低。

但這種方法存在一定缺陷:

  • 必須依據演算法事先編制好程式,這通常需要花費大量的時間和精力。

  • 時間的比較依賴計算機硬體和軟體等環境因素,有時會掩蓋演算法本身的優劣。

  • 演算法的測試資料設計困難,並且程式的執行時間往往還與測試資料的規模有很大關係,效率高的演算法在小的測試資料面前往往得不到體現。

事前分析估算方法

在計算機程式編制前,依據統計方法對演算法進行估算。

一個用高階程式語言編寫的程式在計算機上執行時所消耗的時間取決於下列因素:

  1. 演算法採用的策略、方法。//主要取決於演算法

  2. 編譯產生的程式碼質量。//主要取決於軟體

  3. 問題的輸入規模。

  4. 機器執行指令的速度。//主要取決於硬體效能

由這組資料應該就看得很清楚。當n的值越來越大時,你會發現, 已經沒法和 的結果相比較,最終幾乎可以忽略不計。也就是說,隨著n值變得非常大以後,演算法G其實已經很趨近於演算法I。於是我們可以得到這樣一個結論,判斷一個演算法的效率時,函式中的常數和其他次要項常常可以忽略,而更應該關注主項(最高階項)的階數

判斷一個演算法好不好,我們只通過少量的資料是不能做出準確判斷的。根據剛才的幾個樣例,我們發現,如果我們可以對比這幾個演算法的關鍵執行次數函式的漸近增長性,基本就可以分析出:某個演算法,隨著n 的增大,它會越來越優於另一演算法,或者越來越差於另一演算法。這其實就是事前估算方法的理論依據,通過演算法時間複雜度來估算演算法時間效率。

演算法時間複雜度

時間複雜度:在進行演算法分析時,語句總的執行次數 是關於問題規模n的函式,進而分析 隨n的變化情況並確定 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作: 。它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸近時間複雜度,簡稱為時間複雜度。其中 是問題規模n的某個函式。