資料結構與演算法總論 (轉)
說明:下面的文章小部分是參考了以前學校BBS上面的一篇文章,由於沒有留下當時的出處,所以無法寫下對這篇文章部分內容的原始作者,特此說明,並表示對他的感謝。
(一)何謂資料結構
資料結構是在整個科學與技術領域上廣泛被使用的術語。它用來反映一個資料的內部構成,即一個資料由那些成分資料構成,以什麼方式構成,呈什麼結構。資料結構有邏輯上的資料結構和物理上的資料結構之分。邏輯上的資料結構反映成分資料之間的邏輯關係,而物理上的資料結構反映成分資料在計算機內部的安排。資料結構是資料存在的形式。 資料結構是資訊的一種組織方式,其目的是為了提高演算法的,它通常與一組演算法的集合相對應,透過這組演算法集合可以對資料結構中的資料進行某種操作。
資料結構主要研究什麼?
資料結構作為一門學科主要研究資料的各種邏輯結構和儲存結構,以及對資料的各種操作。因此,主要有三個方面的內容:資料的邏輯結構;資料的物理儲存結構;對資料的操作(或演算法)。通常,演算法的設計取決於資料的邏輯結構,演算法的實現取決於資料的物理儲存結構。
什麼是資料結構?什麼是邏輯結構和物理結構?
資料是指由有限的符號(比如,"0"和"1",具有其自己的結構、操作、和相應的語義)組成的元素的集合。結構是元素之間的關係的集合。通常來說,一個資料結構DS 可以表示為一個二元組:
DS=(D,S), //i.e., data-structure=(data-part,logic-structure-part)
這裡D是資料元素的集合(或者是“結點”,可能還含有“資料項”或“資料域”),S是定義在D(或其他集合)上的關係的集合,S = { R | R : D×D×...},稱之為元素的邏輯結構。 邏輯結構有四種基本型別:集合結構、線性結構、樹狀結構和結構。表和樹是最常用的兩種高效資料結構,許多高效的演算法可以用這兩種資料結構來設計實現。表是線性結構的(全序關係),樹(偏序或層次關係)和圖(區域性有序(weak/local orders))是非線性結構。
資料結構的物理結構是指邏輯結構的儲存映象(image)。資料結構 DS 的物理結構 P對應於從 DS 的資料元素到儲存區M(維護著邏輯結構S)的一個對映:
PD,S) -- > M 儲存器模型:一個儲存器 M 是一系列固定大小的儲存單元,每個單元 U 有一個唯一的地址 A(U),該地址被連續地編碼。每個單元 U 有一個唯一的後繼單元 U'=succ(U)。 P 的四種基本對映模型:順序(sequential)、連結(linked)、(indexed)和雜湊(hashing)對映。
因此,我們至少可以得到4×4種可能的物理資料結構:
sequential (sets)
linked lists
indexed trees
hash graphs
(並不是所有的可能組合都合理)資料結構DS上的操作:所有的定義在DS上的操作在改變資料元素(節點)或節點的域時必須保持DS的邏輯和物理結構。
DS上的基本操作:任何其他對DS的高階操作都可以用這些基本操作來實現。最好將DS和他的所有基本操作看作一個整體——稱之為模組。我們可以進一步將該模組抽象為資料型別(其中DS的儲存結構被表示為私有成員,基本操作被表示為公共方法),稱之為ADT。作為ADT,堆疊和佇列都是一種特殊的表,他們擁有表的操作的子集。 對於DATs的高階操作可以被設計為(不封裝的)演算法,利用基本操作對DS進行處理。
好的和壞的DS:如果一個DS可以透過某種“線性規則”被轉化為線性的DS(例如線性表),則稱它為好的DS。好的DS通常對應於好的(高效的)演算法。這是由計算機的計算能力決定的,因為計算機本質上只能存取邏輯連續的單元,因此如何沒有線性化的結構邏輯上是不可計算的。比如對一個圖進行操作,要訪問圖的所有結點,則必須按照某種順序來依次訪問所有節點(要形成一個偏序),必須透過某種方式將圖固有的非線性結構轉化為線性結構才能對圖進行操作。
樹是好的DS——它有非常簡單而高效的線性化規則,因此可以利用樹設計出許多非常高效的演算法。樹的實現和使用都很簡單,但可以解決大量特殊的複雜問題,因此樹是實際中最重要和最有用的一種資料結構。樹的結構本質上有遞迴的性質——每一個葉節點可以被一棵子樹所替代,反之亦然。實際上,每一種遞迴的結構都可以被轉化為(或等價於)樹形結構。
從機器語言到高階語言的抽象
我們知道,演算法被定義為一個運算序列。這個運算序列中的所有運算定義在一類特定的資料模型上,並以解決一類特定問題為目標。這個運算序列應該具備下列四個特徵。 有限性,即序列的項數有限,且每一運算項都可在有限的時間內完成;確定性,即序列的每一項運算都有明確的定義,無二義性;可以沒有輸入運算項,但一定要有輸出運算項;可行性,即對於任意給定的合法的輸入都能得到相應的正確的輸出。這些特徵可以用來判別一個確定的運算序列是否稱得上是一個演算法。 但是,我們現在的問題不是要判別一個確定的運算序列是否稱得上是一個演算法,而是要對一個己經稱得上是演算法的運算序列,回顧我們曾經如何用設計語言去表達它。
演算法的程式表達,歸根到底是演算法要素的程式表達,因為一旦演算法的每一項要素都用程式清楚地表達,整個演算法的程式表達也就不成問題。
作為運算序列的演算法,有三個要素。 作為運算序列中各種運算的運算和運算結果的資料;運算序列中的各種運算;運算序列中的控制轉移。這三種要素依序分別簡稱為資料、運算和控制。 由於演算法層出不窮,變化萬千,其中的運算所作用的物件資料和所得到的結果資料名目繁多,不勝列舉。最簡單最基本的有布林值資料、字元資料、整數和實數資料等;稍複雜的有向量、矩陣、記錄等資料;更復雜的有集合、樹和圖,還有、圖形、影像等資料。 同樣由於演算法層出不窮,變化萬千,其中運算的種類五花八門、多姿多彩。最基本最初等的有賦值運算、算術運算、邏輯運算和關係運算等;稍複雜的有算術和邏輯表示式等;更復雜的有值計算、向量運算、矩陣運算、集合運算,以及表、棧、佇列、樹和圖上的運算等:此外,還可能有以上列舉的運算的複合和巢狀。 關於控制轉移,相對單純。在計算中,它只有順序、分支、迴圈、遞迴和無條件轉移等幾種。
我們來回顧一下,自從計算機問世以來,演算法的上述三要素的程式表達,經歷過一個怎樣的過程。 最早的程式設計語言是機器語言,即具體的計算機上的一個指令集。當時,要在計算機上執行的所有演算法都必須直接用機器語言來表達,計算機才能接受。演算法的運算序列包括運算物件和運算結果都必須轉換為指令序列。其中的每一條指令都以編碼(指令碼和地址碼)的形式出現。與演算法語言表達的演算法,相差十萬八千里。對於沒受過程式設計專門訓練的人來說,一份程式恰似一份"天書",讓人看了不知所云,可讀性極差。 用機器語言表達演算法的運算、資料和控制十分繁雜瑣碎,因為機器語言所提供的指令太初等、原始。機器語言只接受算術運算、按位邏輯運算和數的大小比較運算等。對於稍複雜的運算,都必須一一分解,直到到達最初等的運算才能用相應的指令替代之。機器語言能直接表達的資料只有最原始的位、位元組、和字三種。演算法中即使是最簡單的資料如布林值、字元、整數、和實數,也必須一一地對映到位、位元組和字中,還得一一分配它們的儲存單元。對於演算法中有結構的資料的表達則要麻煩得多。機器語言所提供的控制轉移指令也只有無條件轉移、條件轉移、進入子程式和從子程式返回等最基本的幾種。用它們來構造迴圈、形成分支、函式和過程得事先做許多的準備,還得靠許多的技巧。 直接用機器語言表達演算法有許多缺點。
大量繁雜瑣碎的細節牽制著程式設計師,使他們不可能有更多的時間和精力去從事創造性的勞動,對他們來說更為重要的任務。如確保程式的正確性、高效性。程式設計師既要駕馭程式設計的全域性又要深入每一個區域性直到實現的細節,即使智力超群的程式設計師也常常會顧此失彼,屢出差錯,因而所編出的程式可靠性差,且開發週期長。 由於用機器語言進行程式設計的思維和表達方式與人們的習慣大相徑庭,只有經過較長時間職業訓練的程式設計師才能勝任,使得程式設計曲高和寡。因為它的書面形式全是"密"碼,所以可讀性差,不便於交流與合作。因為它嚴重地依賴於具體的計算機,所以可移植性差,重用性差。這些弊端造成當時的計算機應用未能迅速得到推廣。 克服上述缺點的出路在於程式設計語言的抽象,讓它儘可能地接近於演算法語言。 為此,人們首先注意到的是可讀性和可移植性,因為它們相對地容易透過抽象而得到改善。於是,很快就出現語言。這種語言對機器語言的抽象,首先表現在將機器語言的每一條指令符號化:指令碼代之以記憶符號,地址碼代之以符號地址,使得其含義顯現在符號上而不再隱藏在編碼中,可讓人望"文"生義。其次表現在這種語言擺脫了具體計算機的限制,可在不同指令集的計算機上執行,只要該計算機配上組合語言的一個彙編程式。這無疑是機器語言朝演算法語言靠攏邁出的一步。但是,它離演算法語言還太遠,以致程式設計師還不能從分解演算法的資料、運算和控制到彙編才能直接表達的指令等繁雜瑣碎的事務中解脫出來。 到了50年代中期,出現程式設計的高階語言如Fortran,Algol60,以及後來的PL/l, Pascal等,演算法的程式表達才產生一次大的飛躍。
誠然,演算法最終要表達為具體計算機上的機器語言才能在該計算機上執行,得到所需要的結果。但組合語言的實踐啟發人們,表達成機器語言不必一步到位,可以分兩步走或者可以築橋過河。即先表達成一種中介語言,然後轉成機器語言。組合語言作為一種中介語言,並沒有獲得很大成功,原因是它離演算法語言還太遠。這便指引人們去設計一種儘量接近演算法語言的規範語言,即所謂的高階語言,讓程式設計師可以用它方便地表達演算法,然後藉助於規範的高階語言到規範的機器語言的"翻譯",最終將演算法表達為機器語言。而且,由於高階語言和機器語言都具有規範性,這裡的"翻譯"完全可以機械化地由計算機來完成,就像組合語言被翻譯成機器語言一樣,只要計算機配上一個編譯程式。 上述兩步,前一步由程式設計師去完成,後一步可以由編譯程式去完成。在規定清楚它們各自該做什麼之後,這兩步是完全獨立的。它們各自該如何做互不相干。前一步要做的只是用高階語言正確地表達給定的演算法,產生一個高階語言程式;後一步要做的只是將第一步得到的高階語言程式翻譯成機器語言程式。至於程式設計師如何用高階語言表達演算法和編譯程式如何將高階語言表達的演算法翻譯成機器語言表達的演算法,顯然毫不相干。
處理從演算法語言最終表達成機器語言這一複雜過程的上述思想方法就是一種抽象。組合語言和高階語言的出現都是這種抽象的範例。 與組合語言相比,高階語言的巨大成功在於它在資料、運算和控制三方面的表達中引入許多接近演算法語言的概念和工具,大大地提高抽象地表達演算法的能力。 在運算方面,高階語言如Pascal,除允許原封不動地運用演算法語言的四則運算、邏輯運算、關係運算、算術表示式、邏輯表示式外,還引入強有力的函式與過程的工具,並讓自定義。這一工具的重要性不僅在於它精簡了重複的程式文字段,而且在於它反映出程式的兩級抽象。在函式與過程呼叫級,人們只關心它能做什麼,不必關心它如何做。只是到函式與過程的定義時,人們才給出如何做的細節。用過高階語言的讀者都知道,一旦函式與過程的名稱、引數和功能被規定清楚,那麼,在程式中呼叫它們便與在程式的頭部說明它們完全分開。你可以修改甚至更換函式體與過程體,而不影響它們的被呼叫。如果把函式與過程名看成是運算名,把引數看成是運算的物件或運算的結果,那麼,函式與過程的呼叫和初等運算的引用沒有兩樣。利用函式和過程以及它們的複合或巢狀可以很自然地表達演算法語言中任何複雜的運算。 在資料方面,高階語言如Pascal引人了資料型別的概念,即把所有的資料加以分類。每一個資料(包括表示式)或每一個資料變數都屬於其中確定的一類。稱這一類資料為一個資料型別。 因此,資料型別是資料或資料變數類屬的說明,它指示該資料或資料變數可能取的值的全體。對於無結構的資料,高階語言如Pascal,除提供標準的基本資料型別--布林型、字元型、整型和實型外,還提供使用者可自定義的列舉型別、子界型別和指標型別。這些型別(除指標外),其使用方式都順應人們在演算法語言中使用的習慣。對於有結構的資料,高階語言如Pascal,提供了陣列、記錄、有限制的集合和等四種標準的結構資料型別。其中,陣列是科學計算中的向量、矩陣的抽象;記錄是商業和管理中的記錄的抽象;有限制的集合是數學中足夠小的集合的勢集的抽象;檔案是諸如等外儲存資料的抽象。人們可以利用所提供的基本資料型別(包括標準的和自定義的),按陣列、記錄、有限制的集合和檔案的構造規則構造有結構的資料。 此外,還允許使用者利用標準的結構資料型別,透過複合或巢狀構造更復雜更高層的結構資料。這使得高階語言中的資料型別呈明顯的分層。 高階語言中資料型別的分層是沒有窮盡的,因而用它們可以表達演算法語言中任何複雜層次的資料。 在控制方面,高階語言如Pascal,提供了表達演算法控制轉移的六種方式。
(1)預設的順序控制";"。
(2)條件(分支)控制:"if表示式(為真)then S1 else S2;" 。
(3)選擇(情況)控制:
"Case 表示式 of
值1: S1
值2: S2
...
值n: Sn
end"
(4)迴圈控制:
"while 表示式(為真) do S;" 或
"repeat S until 表示式(為真);" 或
"for變數名:=初值 to/downto 終值do S;"
(5)函式和過程的呼叫,包括遞迴函式和遞迴過程的呼叫。
(6)無條件轉移goto。
這六種表達方式不僅覆蓋了演算法語言中所有控制表達的要求,而且不再像機器語言或組合語言那樣原始、那樣繁瑣、那樣隱晦,而是如上面所看到的,與自然語言的表達相差無幾。 程式設計語言從機器語言到高階語言的抽象,帶來的主要好處是: 高階語言接近演算法語言,易學、易掌握,一般工程技術人員只要幾周時間的培訓就可以勝任程式設計師的工作;高階語言為程式設計師提供了結構化程式設計的環境和工具,使得設計出來的程式可讀性好,可維護性強,可靠性高;高階語言遠離機器語言,與具體的計算機關係不大,因而所寫出來的程式可移植性好,重用率高; 由於把繁雜瑣碎的事務交給了編譯程式去做,所以自動化程度高,開發週期短,且程、序員得到解脫,可以集中時間和精力去從事對於他們來說更為重要的創造性勞動,以提高、程式的質量。
資料結構、資料型別和抽象資料型別
資料結構、資料型別和抽象資料型別,這三個術語在字面上既不同又相近,反映出它們在含義上既有區別又有聯絡。
資料結構是在整個電腦科學與技術領域上廣泛被使用的術語。它用來反映一個資料的內部構成,即一個資料由哪些成分資料構成,以什麼方式構成,呈什麼結構。資料結構有邏輯上的資料結構和物理上的資料結構之分。邏輯上的資料結構反映成分資料之間的邏輯關係,物理上的資料結構反映成分資料在計算機內的儲存安排。資料結構是資料存在的形式。
資料是按照資料結構分類的,具有相同資料結構的資料屬同一類。同一類資料的全體稱為一個資料型別。在程式設計高階語言中,資料型別用來說明一個資料在資料分類中的歸屬。它是資料的一種屬性。這個屬性限定了該資料的變化範圍。為了解題的需要,根據資料結構的種類,高階語言定義了一系列的資料型別。不同的高階語言所定義的資料型別不盡相同。Pascal語言所定義的資料型別的種類。
其中,簡單資料型別對應於簡單的資料結構;構造資料型別對應於複雜的資料結構;在複雜的資料結構裡,允許成分資料本身具有複雜的資料結構,因而,構造資料型別允許複合巢狀;指標型別對應於資料結構中成分資料之間的關係,表面上屬簡單資料型別,實際上都指向複雜的成分資料即構造資料型別中的資料,因此這裡沒有把它劃入簡單資料型別,也沒有劃入構造資料型別,而單獨劃出一類。
資料結構反映資料內部的構成方式,它常常用一個結構圖來描述:資料中的每一項成分資料被看作一個結點,並用方框或圓圈表示,成分資料之間的關係用相應的結點之間帶箭號的連線表示。如果成分資料本身又有它自身的結構,則結構出現巢狀。這裡巢狀還允許是遞迴的巢狀。
由於指標資料的引入,使構造各種複雜的資料結構成為可能。按資料結構中的成分資料之間的關係,資料結構有線性與非線性之分。在非線性資料結構中又有層次與網狀之分。 由於資料型別是按照資料結構劃分的,因此,一類資料結構對應著一種資料型別。資料型別按照該型別中的資料所呈現的結構也有線性與非線性之分,層次與網狀之分。一個資料變數,在高階語言中的型別說明必須是讀變數所具有的資料結構所對應的資料型別。最常用的資料結構是陣列結構和記錄結構。陣列結構的特點是:
成分資料的個數固定,它們之間的邏輯關係由成分資料的序號(或叫陣列的下標)來體現。這些成分資料按照序號的先後順序一個挨一個地排列起來。每一個成分資料具有相同的結構(可以是簡單結構,也可以是複雜結構),因而屬於同一個資料型別(相應地是簡單資料型別或構造資料型別)。這種同一的資料型別稱為基型別。所有的成分資料被依序安排在一片連續的儲存單元中。 概括起來,陣列結構是一個線性的、均勻的、其成分資料可隨機訪問的結構。由於這、種結構有這些良好的特性,所以最常被人們所採用。在高階語言中,與陣列結構相對應的、資料型別是陣列型別,即陣列結構的資料變數必須說明為array [i] of T0 ,其中i是陣列、結構的下標型別,而T0是陣列結構的基型別。 記錄結構是另一種常用的資料結構。它的特點是:與陣列結構一樣,成分資料的個數固定。但成分資料之間沒有自然序,它們處於平等地位。每一個成分資料被稱為一個域並賦予域名。不同的域有不同的域名。不同的域允許有不同的結構,因而允許屬於不同的資料型別。與陣列結構一樣,它們可以隨機訪問,但訪問的途徑靠的是域名。在高階語言中記錄結構對應的資料型別是記錄型別。記錄結構的資料的變數必須說明為記錄型別。
抽象資料型別的含義在上一段已作了專門敘述。它可理解為資料型別的進一步抽象。即把資料型別和資料型別上的運算捆在一起,進行封裝。引入抽象資料型別的目的是把資料型別的表示和資料型別上運算的實現與這些資料型別和運算在程式中的引用隔開,使它們相互獨立。對於抽象資料型別的描述,除了必須描述它的資料結構外,還必須描述定義在它上面的運算(過程或函式)。抽象資料型別上定義的過程和函式以該抽象資料型別的資料所應具有的資料結構為基礎。
(二)泛型設計和資料結構與演算法
下面我想再說說關於泛型程式設計模型對於資料結構和演算法方面的最新推動,泛型思想已經把資料結構和演算法方面的基本思想抽象到了一個前所未有的高度,現在有多種程式設計語言支援泛型設計,比如ADA,C++,而且據說在的下一版本和中也將對泛型設計進行全面的支援。
先說說泛型設計的基本思想:泛型程式設計(generic programming,以下直接以GP稱呼)是一種全新的程式設計思想,和OO,OB,PO這些為人所熟知的程式設計想法不同的是GP抽象度更高,基於GP設計的之間偶合度底,沒有繼承關係,所以其元件間的互交性和擴充套件性都非常高。我們都知道,任何演算法都是作用在一種特定的資料結構上的,最簡單的例子就是排序演算法最根本的實現條件就是所排序的物件是存貯在陣列裡面,因為快速排序就是因為要用到陣列的隨機儲存特性,即可以在單位時間內遠距離的物件,而不只是相臨的兩個物件,而如果用聯表去儲存物件,由於在聯表中取得物件的時間是線性的既O[n],這樣將使快速排序失去其快速的特點。也就是說,我們在設計一種演算法的時候,我們總是先要考慮其應用的資料結構,比如陣列查詢,聯表查詢,樹查詢,圖查詢其核心都是查詢,但因為作用的資料結構不同將有多種不同的表現形式。資料結構和演算法之間這樣密切的關係一直是我們以前的認識。泛型設計的根本思想就是想把演算法和其作用的資料結構分離,也就是說,我們設計演算法的時候並不去考慮我們設計的演算法將作用於何種資料結構之上。泛型設計的理想狀態是一個查詢演算法將可以作用於陣列,聯表,樹,圖等各種資料結構之上,變成一個通用的,泛型的演算法。這樣的理想是不是很誘惑人?
泛型程式設計帶來的是前所未有的彈性以及不會損失效率的抽象性,GP和OO不同,它不要求你透過額外的間接層來呼叫函式:它讓你撰寫完全一般化並可重複使用的演算法,其效率與針對特定資料結構而設計的演算法旗鼓相當。我們大家都知道資料結構在C++中可以用使用者定義型別來表示,而C++中的模板技術就是以型別作為引數,那麼我可以想象利用模板技術可以實現我們開始的GP思想,即一個模板函式可以對於各種傳遞進來的型別起作用,而這些型別就可以是我們定義的各種資料結構。泛型演算法抽離於特定型別和特定資料結構之外,使得其適應與儘可能的一般化型別,演算法本身只是為了實現演算法其需要表達的邏輯本質而不去被為各種資料結構的實現細節所干擾。這意味著一個泛型演算法實際具有兩部分。1,用來描敘演算法本質邏輯的實際指令;2,正確指定其引數型別必須滿足的性質的一組需求條件。到此,相信有不少人已經開始糊塗了,呵呵,不要緊。畢竟GP是一種抽象度非常高的程式設計思想,裡面的核心就是抽象條件成為成為程式設計過程中的核心,從而取代了型別這在OO裡面的核心地位,正是因為型別不在是我們考慮的重點,型別成為了抽象條件的外衣,所以我們稱這樣的程式思想為泛型思想------把型別泛化。
(三)個人學習心得
至於如何學習資料結構,我個人認為合適的方法是,首先從根本上就要認識到資料結構的本質,資料結構和演算法之間的密切關係,以及資料結構的應用方法。不然我們很可能陷入各種資料結構的複雜特性中卻還根本不知道到底什麼才是資料結構的本質,學了很多很久卻其實什麼都沒有弄明白,在這裡我說點我個人的一點關於資料結構本質的東西:
學好資料結構最重要的是對程式設計方式和程式語言概念和實現的理解int i;
int i[];
struct i{};
ADT i{};
到底有什麼區別,這就是程式設計語言實現的問題了。
定義了一種資料型別就是定義了一類操作
int i,j;i=j+1;
這樣的操作在語言本身中實現了,也就是說你不需要關心這樣的操作程式語言是如何完成的,所以int就是基本資料型別
抽象了基本資料型別的就是資料結構。
當你定義了
ADT P{};
的時候,比如如果P是連結串列,這就要你去實現它各種的操作。而且P能夠完成的所有操作都必須由你去實現,而你實現得基礎就是這些char int float *p...基本資料型別。這就是抽象資料型別。
當你把型別定義完成後,剩下的就是演算法去完成程式流程的控制。
所以:資料結構+演算法=程式
還想說點的是,設計思想,程式設計語言,和資料結構,始終是促進電腦科學發展的最大動力。一般來說都是思想先與語言,然後出現支援這種思想和包含這樣思想的資料型別的語言實現。
具體說:
面向機器程式設計 機器語言,組合語言
程式導向程式設計 C。。。。語言
物件導向程式設計 JAVA C++
當然思想畢竟只是思想,你可以用不同的語言實現。但必須說明的是隻能用一個層面上的語言實現。 比如,機器語言,由於其語言本身抽象層很低,低到了就像給一個物件賦值的操作也要程式設計師進行位操作。為在語言實現這個層面上,它不支援。 為什麼說C也可以進物件導向的程式設計呢?關鍵就在C很好的支援ADT了。他可以用複雜了ADT去代替C++中已經變成基本資料型別的CLASS,但是正是因為要用C完成OO,必須程式設計師來實現(定義ADT)。所以說,C不適合開發OO軟體。而C++卻恰恰把CLASS定義成了一個基本型別,這樣就完成了OO這一個層次的抽象。當然由於C++是C的超集,他同樣是完全支援程式導向的。
說了這麼多,就是想說說 資料結構和程式語言和設計思想的關係。當我們能把資料結構的學習和程式設計語言,程式設計想法相聯絡起來的時候,我想我們對資料結構本身的認識已經更加深刻了,我們學習到每一種的新的資料結構的時候我們不再恐慌,因為我們知道了任何一種資料結構都有其共同的共性和特殊的特性,每一種資料結構都是為了一個領域所現實的,從這一方面來說,資料結構本身就具有繼承特性,我們可以用一個繼承樹來表示一個完整的資料結構體系,而每一種資料結構都是繼承體系中的一個子節點。
最後在這裡我推薦幾本我覺得比較出色的資料結構方面的教材:
《資料結構與演算法------物件導向的C++設計》 電子工業出版社出版。在amazon上是五星評價,個人認為其對資料結構的整體描敘和對各種應用演算法十分出色。
《Algorithm in c++ I-V》是RS的著作《Algorithm in c》的C++版本,完整的描敘了各種演算法,amazon上五星評價,高等教育出版社有其影印版。
《data structrus in C++ with STL》 使用C++標準模板庫來描敘資料結構,是使用泛型設計的方法描敘資料結構的一本全面教材。清華出版了中文版,但有其影印版。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998312/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構與演算法整理總結---排序 2資料結構演算法排序
- 資料結構與演算法整理總結---跳錶資料結構演算法
- 資料結構與演算法整理總結---雜湊演算法資料結構演算法
- 【演算法與資料結構】經典排序演算法總結演算法資料結構排序
- 資料結構與演算法-反轉排序資料結構演算法排序
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 資料結構與演算法整理總結---雜湊表資料結構演算法
- 資料結構與演算法學習總結--遞迴資料結構演算法遞迴
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- 資料結構與演算法整理總結---演算法複雜度資料結構演算法複雜度
- 資料結構與演算法整理總結---陣列,連結串列資料結構演算法陣列
- 【資料結構與演算法】揹包問題總結梳理資料結構演算法
- 《學習JavaScript資料結構與演算法》閱讀總結JavaScript資料結構演算法
- 資料結構與演算法資料結構演算法
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- 資料結構和演算法總結--棧資料結構演算法
- 資料結構與演算法:圖形結構資料結構演算法
- 資料結構與演算法彙總(持續更新中)資料結構演算法
- 資料結構與演算法整理總結---二分查詢資料結構演算法
- 資料結構與演算法知識點總結(1)陣列與連結串列資料結構演算法陣列
- 【JavaScript 演算法與資料結構】JavaScript演算法資料結構
- 資料結構與演算法03資料結構演算法
- 演算法與資料結構——序演算法資料結構
- 資料結構與演算法——概述資料結構演算法
- 資料結構與演算法-堆資料結構演算法
- 資料結構與演算法02資料結構演算法
- 資料結構與演算法(1)資料結構演算法
- 資料結構與演算法——排序資料結構演算法排序
- 資料結構與演算法——字串資料結構演算法字串
- 資料結構與演算法(java)資料結構演算法Java
- 資料結構與演算法 - 串資料結構演算法
- 【資料結構與演算法】bitmap資料結構演算法
- 資料結構~總結與文章目錄資料結構
- 資料結構與演算法知識點總結(4)各類排序演算法資料結構演算法排序
- 資料結構與演算法之線性結構資料結構演算法
- 資料結構與演算法知識點總結(5)查詢樹資料結構演算法
- 資料結構總結 第一章:緒論資料結構
- 資料結構與演算法-連結串列資料結構演算法