數據結構基本概念及算法和算法分析 -- 引自《新編數據結構習題與解析》(李春葆等著)

  本文引自《新編數據結構習題與解析》(李春葆等著)第1章。算法

 1. 數據結構的基本概念

  1.1 數據

  數據是對客觀事物的符號表示,在計算機科學中是指全部能輸入到計算機中並被計算機程序處理的符號的總稱。例如,整數、實數和字符串都是數據。數組

  1.2 數據元素

  數據元素也稱爲節點,是表示數據的基本單元,在計算機程序中一般做爲一個總體進行考慮和處理。數據結構

  1.3 數據項

  數據項是數據的最小單位。數據元素能夠由若干個數據項組成。例如,學生記錄就是一個數據元素,它由學號、姓名、性別等數據項組成。函數

  1.4 數據對象

  數據對象是性質相同的數據元素的集合,是數據的一個子集。例如,大寫字母就是一個數據對象,大寫字母數據對象是集合{‘A’, 'B', ... , 'Z'}。在數據結構中數據一般指的是數據對象。spa

  1.5 數據結構

  數據結構是指相互之間存在某種關係的數據元素的集合,數據結構中的關係主要是指相鄰關係。數據結構包括三方面內容:邏輯結構、存儲結構和對數據的運算。操作系統

  1.6 數據結構的形式化定義

  數據結構的形式化定義數據結構是一個二元組:數據結構DS=(D, R),其中,D是數據元素的有限集,R是D上關係的有限集。例子見《新編數據結構習題與解析》。設計

  1.7 數據的邏輯結構

  數據的邏輯結構是指數據結構定義中的「關係」,描述的是數據元素的邏輯關係,它與數據的存儲結構無關,同一邏輯結構能夠對應多種存儲結構。概括起來,數據的邏輯結構主要有三大類:指針

  (1)線性結構code

  線性結構是指該結構中的元素之間存在一對一的關係。其特色是開始元素和終端元素都是惟一的,除此以外,其他每一個元素都有且僅有一個前驅元素和一個後繼元素。線性表就是一種典型的線性結構。對象

  (2)樹形結構

  樹形結構是指該結構中的元素之間存在一對多的關係。只有一個元素爲開始元素(也稱爲根節點),能夠有多個終端元素,每一個元素有零個或多個後繼元素,除開始元素外每一個元素只有一個前驅元素。

  (3)圖形結構

  圖形結構是指該結構中的元素之間存在多對多的關係,每一個元素能夠有多個前驅元素和多個後繼元素。

  樹形結構和圖形結構統稱爲非線性結構。

  1.8 數據的物理結構

  數據的物理結構又稱存儲結構,是數據的邏輯結構在計算機中的存儲形式(又稱映像)。它包括數據元素的表示和關係的表示。當數據元素是由若干數據項構成時,數據項的表示稱爲數據域。

  數據元素之間的關係在計算機中有兩種不一樣的表示方法:順序映像和非順序映像。對應的兩種不一樣的存儲結構分別是順序存儲結構和鏈式存儲結構。

  順序映像是藉助數據元素在存儲器中的物理位置來表示數據元素之間的邏輯關係;非順序映像是藉助指針(指示數據元素的存儲地址)表示數據元素之間的邏輯關係。實際上,在數據結構中有如下4種經常使用的存儲方法:

  (1)順序存儲方法

  該方法是把數據元素存放在地址連續的存儲單元裏,邏輯上相鄰的元素其存儲的物理位置也相鄰,數據元素之間的邏輯關係和物理關係是一致的。由此獲得的存儲表示稱爲順序存儲結構,一般順序存儲結構是藉助於計算機程序設計語言的數組來描述的。

  (2)鏈式存儲方法

  該方法是把數據元素存放在任意的存儲單元裏,不要求邏輯上相鄰的節點在物理位置上亦相鄰,節點間的邏輯關係是由附加的指針字段表示的。由此獲得的存儲表示稱爲鏈式存儲結構,一般要藉助於計算機程序設計語言的指針類型來描述它。

  (3)索引存儲方法

  該方法一般是在存儲節點信息的同時,還創建附加的索引表。索引表中的每一項稱爲索引項,索引項的通常形式是:(關鍵字,地址),關鍵字惟一標識一個節點,地址做爲指向節點的指針。這種帶有索引表的存儲結構能夠大大提升數據查找的速度。

  (4)散列(或哈希)存儲方法

  該方法的基本思想是根據節點的關鍵字,經過哈希函數直接計算出該節點的存儲地址。這種存儲方法從本質上講是順序存儲方法和鏈式存儲方法的擴展。

  1.9 數據的運算

  一個數據結構所包含的數據運算的種類和個數以及每種運算中的參數個數和類型,都應依據數據結構的實際用途和須要來設定。它們只有在必定的存儲結構上具體實現以後纔有真實意義,因此數據運算的實現和執行效率都與存儲結構有關。

  1.10 數據類型

  數據類型是一個值的集合和定義在這個值集上的一組操做的總稱。例如,C語言中的int是一種整型數據類型,int型變量的取值爲某個區間上的整數(例如在16位機上的區間爲-32768~32767),定義在其上的操做爲加、減、乘、除等運算。

  1.11 抽象數據類型(ADT)

  抽象數據類型(ADT)是指一個數據模型以及定義在該模型上的一組操做。ADT一般由用戶定義,用以表示應用問題的數據的數據模型,ADT由基本數據類型組成,幷包括一組相關的操做。其特徵是使用與實現分離,實現封裝和信息隱藏,也就是說,在ADT設計時,把類型的聲明與其實現分離開來。

 2. 算法和算法分析

  2.1 算法

  算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示一個或多個操做。

  2.2 算法的特性

  (1)有窮性

  一個算法必須老是(對任何合法的輸入值)在執行有窮步以後結束,且每一步均可在有窮時間內完成。也就是說,一個算法對於任意一組合法輸入值,在執行有窮步驟以後必定能結束。

  (2)肯定性

  對於每種狀況下所應執行的操做,在算法中都有確切的規定,使算法的執行者或閱讀者都能明確其含義及如何執行。而且在任何條件下,算法都只有一條執行路徑。

  (3)可行性

  算法中的全部操做都必須足夠基本,均可以經過已經實現的基本操做運算有限次實現之。

  (4)有輸入

  做爲算法加工對象的量值,一般體現爲算法中的一組變量。有些輸入量須要在算法執行過程當中輸入,而有的算法表面能夠沒有輸入,實際上已經嵌入算法之中。

  (5)有輸出

  它是一組與「輸入」有肯定關係的量值,是算法進行信息加工後獲得的結果,這種肯定關係即爲算法的功能。

  注:算法和程序不一樣,程序能夠不知足有窮性。例如,一個操做系統在用戶未操做以前一直處於「等待」的循環中,直到出現新的用戶操做爲止。通常的程序都不會出現這種狀況,因此在不少狀況下對算法和程序這兩個術語不加以嚴格區分。

  2.3 算法描述

  算法描述採用天然語言或某種計算機語言給出算法的指令序列。

  2.4 算法設計目標

  (1)正確性

  (2)可以使用性

  (3)可讀性

  (4)健壯性

  要求算法具備很好的容錯性,即提供異常處理,可以對不合理的數據進行檢查。不常常出現異常中斷或死機現象。

  (5)高效率和低存儲量需求

  算法效率經過算法時間複雜度和空間複雜度來描述。  

  2.5 算法時間複雜度

  算法時間複雜度以算法中基本操做重複執行的次數(簡稱爲頻度)做爲算法的時間度量。通常沒必要精確計算出算法的時間複雜度,只要大概計算出相應的數量級便可,如O(1)、O(n)等。

  O的形式定義爲:若f(n)是正整數n(n表示問題規模)的一個函數,則T(n)=O(f(n))表示存在一個正的常數M,使得當n>=n0時知足|T(n)|<=M*|f(n)|。換句話說,O(f(n))給出了函數f(n)的上界。

  當算法時間複雜度T(n)與n無關時,T(n)=O(1);當算法時間複雜度T(n)與n爲線性關係時,T(n)=O(n);依此類推。通常地,經常使用的時間複雜度有以下關係:

  O(1)<=O(log2n)<=O(n)<=O(nlog2n)<=O(n2)<=O(n3)<=…<=O(nk)<=O(2n)

 

  求解方法概括:

  1)肯定問題規模n:一般在形參中給出。

  2)計算算法中的語句頻度T(n):一般以算法中的基本運算(如有循環,循環中最深層的語句爲基本運算)爲核心,求出其執行的次數。

  3)用大O表示:只保留T(n)的最高階項,若是這個最高階項的序數不爲1,除去這個序數。

 

  2.6 空間複雜度

  它是算法所需存儲空間的度量,主要考慮在算法運行過程當中臨時佔用的存儲空間的大小,通常以數量級的形式給出。

  一個算法的臨時存儲空間是指函數體內新開闢的空間,不包括形參佔用的空間。如:

 1 // 函數體內開闢了i,s變量的空間,與n無關,因此空間複雜度爲O(1),
 2 // 不計形參a佔用的空間。
 3 int fun(int a[], int n)
 4 {
 5     int i, s = 0;
 6     for (i = 0; i < n; i++)
 7     {
 8         s += a[i];
 9     }
10     return s;
11 }
相關文章
相關標籤/搜索