1. 程式人生 > >資料結構的基本知識(一)

資料結構的基本知識(一)

1.資料結構的基本概念

資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及它們之間的關係和操作等相關問題的學科。

資料是人們利用文字元號、數字符號以及其他規定的符號對現實世界的事物及其活動所做的抽象描述。換言之,資料是資訊的載體,是客觀事物的符號表示。資料能夠被計算機識別、存取和處理的“原料”。

資料元素是資料的基本單位。一個數據元素由若干個資料項組成。

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

資料結構分為邏輯結構和物理結構。

資料的邏輯結構指資料元素之間的邏輯關係(資料元素之間的前後關係)的資料結構,而與它們在計算機中的儲存位置無關。

資料的邏輯結構主要可分為集合結構、線性結構、樹型結構和圖型結構四種,如下圖:
資料的邏輯結構

集合結構的資料元素同屬於一個集合,它們之間是並列關係,除此之外沒有其他關係。

線性結構是除第一個和最後一個數據元素之外,每個資料元素只有一個唯一的前驅資料元素和一個唯一的後繼資料元素。線性結構中的資料元素之間存在一個一對一的關係。

樹形結構是除根結點外,每個資料元素只有一個唯一的前驅資料元素,可有零個或若干個後繼資料元素。樹形結構中的資料元素之間存在一個一對多的關係。

圖形結構是每個資料元素有零個或若干個前驅資料元素和零個或若干個後繼資料元素。圖形結構中的資料元素存在多個多對多的關係。

資料的儲存結構(物理結構)是指資料的邏輯結構在計算機儲存空間的存放形式,即資料在計算機中的儲存表示,它包括資料元素的表示和關係的表示。通俗的講,物理結構研究的是資料在儲存器中存放的形式。

資料的儲存結構的基本形式有四種:順序儲存結構、鏈式儲存結構和索引儲存結構和雜湊儲存結構。如下圖:

資料的儲存結構

順序儲存機構是指把資料元素儲存在一塊連續地址空間的記憶體中。其特點是邏輯上相鄰的資料元素在物理上也相鄰,資料的邏輯關係表現在資料元素的儲存位置關係上。

鏈式儲存結構是使用指標把相互直接關聯的結點(即直接前驅結點或直接後繼結點)連結起來。其特點是邏輯上相鄰的資料元素在物理上(即記憶體儲存位置上)不一定相鄰,資料間的邏輯關係表現在結點的連結關係上。

索引儲存是通常在儲存節點資訊的同時,還要建立附加索引表,而索引表由若干索引項組成。若每個節點在索引表都有一個索引項,則該索引表稱為稠密索引。若一組節點在索引表中只對應一個索引項,則該索引表稱為稀疏索引。索引項的形式一般是(關鍵字,地址),關鍵字是能唯一標識一個結點的那些資料項。稠密索引中索引項的地址指示結點所在的儲存位置,稀疏索引中索引項的地址指示一組結點的起始儲存位置。

雜湊儲存結構是根據節點的關鍵字直接計算出該節點的儲存地址。

資料的運算是對資料施加的操作。資料的運算定義在資料的邏輯結構上,每種邏輯結構都有一個運算的集合。在資料結構中,運算不僅僅是加、減、乘、除等運算,大多數的運算都設計演算法的實現問題,演算法的實現與資料的儲存結構是密切相關的。

一種資料型別資料允許進行的某種操作稱為資料的操作。一種資料型別資料所有的操作稱為資料的操作集合

型別是一組值的集合。

資料型別是指一個值的集合和定義在這個值的集合上的一組操作的總稱,通常它可看做是高階程式設計語言中的已經實現的資料結構。

抽象資料型別(ADT)是指一個邏輯概念上的型別和這個型別上的操作集合。抽象資料型別是指一個數學模型以及定義在該模型上的一組操作。抽象資料型別可表示為一個三元組式(D,R,P),其中,D是資料物件,R是D上的關係集,P是對D的基本操作集合。

當軟體設計問題具體確定時,抽象資料元素的資料型別將被具體資料元素的資料型別取代。

2.演算法

2.1 演算法的描述

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

演算法具有五個基本特徵:輸入,輸出有窮性,確定性和可行性。
1)有窮性:有限步驟必須結束。
2)確定性:演算法中每一個操作必須有確切的含義,無二義性,並在任何條件下,演算法都只有一條執行路徑。
3)可行性:演算法中的所有操作都可通過已經實現的基本運算有限次地實現。每條指令必須可以執行並有正確的結果。
4)輸入:演算法具有零個或多個輸入,它們是在演算法開始前對演算法給定的量。這些輸入取自於特定物件的集合。
5)輸出:演算法具有一個或多個輸出,它們與輸入有某種特定關係。

演算法要用某種語言來描述。描述演算法的語言主要有三種形式:文字形式,虛擬碼形式和程式設計語言形式。

文字形式是指用中文或英文這樣的文字來描述演算法。

偽碼形式是指用一種仿程式設計語言的語言來描述演算法。

程式設計語言形式是指用某種高階程式設計語言來描述演算法,優點是這樣的演算法描述既簡潔易讀,又可以直接輸入計算機呼叫或執行。

2.2 演算法的設計與分析

演算法設計應滿足正確性,可讀性,健壯性,高時間效率和高空間效率。

演算法的可讀性有利於人們對演算法的理解,這既有利於程式的除錯和維護,也有利於演算法的交流和移植。演算法的可讀性主要體現在兩個方面:一是變數名、常量名、函式名等的命名要見名知意,二是要有足夠多的註釋。

演算法的健壯性在於當輸入不合法的資料時,演算法能夠做出適當的反應或處理,不至於產生莫名其妙的結果。同時,處理出錯的方法應該是返回一個表示錯誤或錯誤性的值,並終止程式的執行,以便在更高的抽象層次上進行處理。

演算法的時空效率是在演算法執行的時間應該儘可能短、演算法執行過程中佔用的儲存空間應該儘可能少。

演算法分析的兩個主要方面是分析演算法的時間複雜度和空間複雜度,主要考察演算法的時間效率和空間效率,以便比較和改進演算法。

演算法的時間效率是指執行演算法需要花費時間的多少。

演算法的空間效率是指執行演算法需要佔用的額外記憶體空間的多少。

演算法的耗時與演算法所處理資料個數n的函式關係的分析稱作演算法的時間效率分析,也稱作演算法的時間複雜度分析。它通常採用O(f(n))表示。

一般而言,演算法中基本操作頻度是問題規模n的某個函式f(n),演算法的時間量度記作T(n) = O(f(n))。它表示隨問題規模n的增大,演算法執行時間增長率與f(n)的增長率相同,稱為演算法的漸進時間複雜度,簡稱時間複雜度

若是對一個演算法在執行過程中臨時佔用儲存空間大小的量度,記做S(n)=O(f(n)),並稱為空間複雜度

每天進步一點點,資料結構的基本知識小結如下:

資料結構的基本概念