1. 程式人生 > >資料結構與演算法(一)——相關概念

資料結構與演算法(一)——相關概念

引子

Algorithms + Data Structures = Programs (演算法+資料結構=程式)

程式設計包括演算法,資料結構和程式設計語言三部分.演算法是求解問題的過程描述,資料結構是對所要求解問題中的資料的儲存和演算法策略實現的支援,程式設計語言是使用計算機求解問題,是在計算機上實現演算法和資料結構.

資料結構研究什麼?

資料結構研究資料之間的關係,還要研究對給定資料可能存在的操作,以及如何組織資料才能夠高效地實現這些操作。

相關概念:

資料:資料是對客觀事物的符號表示,是資訊的載體;

資料元素:資料元素是資料集合中的一個個體,是計算機程式加工處理的基本單位;

資料項:資料元素由多個數據項組成;

資料物件:具有相同性質的資料元素的集合;

資料結構:帶有結構的資料元素的集合。資料結構可以用一個四元組來表示:Data_Structure=(D,L,S,O)

                D(Data):資料元素的有限集,是儲存和操作的物件;

                L(Logical Structure):資料元素集合D中資料元素之間客觀存在的關係的有限集,稱為邏輯結構;

                S(Storage Structure):資料元素集合D和資料元素之間的關係集合L在計算機中的儲存表示,稱為儲存結構或物理結構;

                O(Operation):是在資料元素集合D上規定的一組操作.也稱為運算.資料結構的基本操作通常有資料結構的建立和銷燬,資料元素的查詢,插入,刪除,遍歷和排序等.

*也常定義為二元組(D,R),其中D(Data)是資料元素的有限集,R(Relationship)是D中資料元素之間客觀存在的關係的有限集.

邏輯結構:資料元素之間客觀存在的關係,與資料在計算機中如何儲存無關.通常也把資料的邏輯結構簡稱為資料結構.

     邏輯結構的劃分(一)          I. 線性結構:有且僅有一個開始和一個終端結點,並且所有結點都最多隻有一個直接前趨和一個直接後繼。       例如:線性表、棧、佇列、串          II.非線性結構:一個結點可能有多個直接前趨和直接後繼。       例如:樹、圖等。

     邏輯結構的劃分(二)       I. 集合:結構中的資料元素除了同屬於一種類型外,別無其它關係。       II. 線性結構:結構中的資料元素之間存在一對一的關係。       III. 樹型結構:結構中的資料元素之間存在一對多的關係。       IV. 圖狀結構(網狀結構):結構中的資料元素之間存在多對多的關係。

儲存結構:資料的儲存結構也稱為物理結構,指的是資料結構在計算機中的儲存表示,包括資料結構中元素的表示及元素間關係的表示.

     儲存結構的劃分:

     I. 順序儲存結構:把邏輯上相鄰的元素儲存在物理結構相鄰的儲存單元中;特點是藉助於資料元素在儲存器中的相對位置來表示資料元素之間的邏輯關係.常藉助於程式設計語言中的陣列來實現.

     II.鏈式儲存結構:在資料元素中新增地址域或輔助結構,用來存放資料元素之間的關係.藉助於指示資料元素地址的指標表示資料元素之間的邏輯關係.不要求邏輯上相鄰的元素在儲存器中的位置也相鄰.常藉助於程式設計語言中的指標型別或索引結構來實現.

     III.雜湊儲存結構:也稱雜湊結構.通過對關鍵字直接計算得到資料元素的儲存位置.對資料元素的儲存和查詢都是通過對關鍵字直接計算得到的.

     注:同樣的邏輯結構可以使用不同的儲存結構來實現.儲存結構的選擇主要考慮演算法的實現以及演算法的時間與空間要求.各種基本的儲存結構既可以單獨使用,也可以組合起來使用.

資料型別及抽象資料型別

資料結構可以理解為是程式設計語言自身實現了的資料結構.在高階程式設計語言中,資料型別可分為:原子型別和結構型別.原子型別是不可以再分解為多個數據型別的資料型別,如C中的整型,字元型,浮點型,雙精度型等資料型別.而結構型別是可分解為多個數據型別的資料型別,其成分可以是原子型別,也可以是結構型別.

抽象資料型別(Abstract Data Type)一般包含資料元素,資料元素之間的關係以及操作三個要素.表示為ADT=(D,R,O). D是資料物件,R是D上的關係集,O是對D的基本操作集。

抽象性:將定義與實現分離.定義時只考慮資料型別的數學抽象特性,實現時再給出這些資料元素的表示及其操作的實現細節.

可擴充套件性:不再侷限於計算機中已定義並實現的基本資料型別,使用者可以通過ADT來用已有的資料型別擴展出尚未實現的資料型別.

Eg:銀行賬戶問題的抽象資料型別定義:

ADT BankAccount{
    /*資料元素定義:用基本的資料型別String,int和float定義了三個資料項,
      銀行賬戶中的每個資料元素即每個賬戶包含這三個資料項*/
    String ownerName;   //使用者名稱
    int accountNumber;  //帳號
    float balance;     //餘額
    /*資料元素的關係定義:該部分省略表明資料元素同屬於一個銀行賬戶,資料元素之間的關係是集合結構*/
    /*基本操作定義:定義了對資料元素的7個基本操作*/
    String getOwnerName();  //查詢使用者名稱
    int getAccountNumber(); //查詢使用者帳號
    float getBalance();  //查詢餘額
    String openAccount(String newName); //開戶
    void cancelAccount(int newNum); //銷戶
    float deposit(float anAmount); //存款並返回新餘額
    float withdraw(float anAmount); //取款並返回取款額
}ADT BankAccount

演算法

演算法是求解特定問題的步驟的有限序列.

演算法特性:

I.功能性:演算法都是用來求解特定問題的,不解決問題的步驟序列不是演算法.

II.有窮性:演算法由有限步驟組成,經過有限步驟後,演算法要達到終止狀態,要結束.

III.確定性:演算法步驟執行的順序是確定的,每步的任務是無二義性的.

IV.可行性:演算法的每一步所描述的任務是明確的,是可以用基本步驟或已有的演算法來實現的.

一個好的演算法應該具備以下特性:

I.正確性:演算法能夠正確求解問題是首要的,也是最基本的.

II.可讀性:好的演算法應該思路清晰,層次分明,閱讀和修改容易.

III.健壯性:健壯性是對演算法在異常情況下處理能力的評價.好的演算法在出現異常或非法資料時,以及在操作不當時,都能夠作適當處理.

IV.高效性:好的演算法應該是高效的,即求解問題所佔用的儲存空間少,執行時間短.