1. 程式人生 > >資料結構(java語言描述)

資料結構(java語言描述)

資料結構(java語言描述)
  概念性描述與《資料結構例項教程》大同小異,具體參考:http://www.cnblogs.com/bookwed/p/6763300.html。

概述
基本概念及術語
資料
資訊的載體,是對客觀事物的符號表示,凡能輸入到計算機中並被計算機程式處理的符號都可稱為資料。
資料元素
是資料的基本單位,它在計算機處理和程式設計中通常作為獨立個體。資料元素一般由一個或多個數據項組成,一個數據元素包含多個數據項時,常稱為記錄、結點等。資料項也稱為域、欄位、屬性、表目、頂點。
如資料庫中的一行就是一個數據元素,每個欄位又叫資料項。
資料物件
是具有相同特徵的資料元素的集合,是資料的一個子集,如一個整型陣列、一個字串陣列都是一個數組物件。
資料結構
簡稱DS(Data Structure),是資料及資料元素的組織形式。任何資料都不是彼此孤立的,通常把相關聯的資料按照一定的邏輯關係組織起來,這樣就形成了一個數據結構。
資料結構包含兩方面的內容,一是資料物件,二是資料物件中資料元素之間內在的關係,通常有四類基本形式:集合結構、線性結構、樹型結構、圖型結構或網狀結構。
集合結構:(參考:

http://www.cnblogs.com/bookwed/p/6763300.html)
線性結構
樹型結構
圖型結構
資料型別
是一組具有相同性質的操作物件以及該組操作物件上的運算方法的集合。每一種資料型別都有自身特點的一組操作方法,即運算規則。Java提供的基本資料型別有:byte、short、int、long、float、double、boolean、char。
基本資料型別:在棧中可以直接分配記憶體;引用資料型別:資料的引用在棧中,但是它的物件在堆中。
資料的邏輯結構
從具體問題抽象出來的數學模型,與資料在計算機中的具體儲存沒有關係,獨立於計算機,是資料本身所固有的屬性。
從邏輯上可以把資料結構分為線性結構和非線性結構。主要有:集合、線性、樹和圖形資料結構,其中集合、樹、圖都屬於非線性結構。
資料的邏輯結構有兩個要素:一是資料元素的集合,通常記為D;二是D上的關係集,它反映了D中各資料元素之間的前驅後繼關係。通常記為R,即一個數據結構可以表示成二元組B=(D,R)。
如一年四季可以表示成B1=(D1,R1),其中D1={春,夏,秋,冬},R1={<春,夏>,<夏,秋>,<秋,冬>};注意,<x,y>意為x和y之間存在“x領先於y”的次序關係。而(x,y)表示x和y之間沒有次序上的關係。
資料的物理結構
又稱儲存結構,主要研究在計算機中如何表示和儲存資料結構。分:順序和鏈式兩種,順序儲存的特點是資料元素在儲存器的相對位置來體現資料元素相互間的邏輯關係,順序儲存結構通常用高階程式語言中的一維陣列來描述或實現。
鏈式儲存結構是通過一組任意的儲存單元來儲存資料元素的,而這些儲存單元可以是連續的,也可以是不連續的。
在順序儲存結構的基礎上,又可延伸出兩種,即索引儲存和雜湊儲存。
索引儲存就是在資料檔案的基礎上增加了一個索引表文件。通過索引表建立索引,可以把一個順序表分成幾個順序子表,其目的是在查詢時提高查詢效率,避免盲目查詢。
雜湊儲存就是通過資料元素與儲存地址之間建立起某種對映關係,使每個資料元素與每一個儲存地址之間儘量達到一一對應的目的。這樣,查詢時可以大大提高效率。
面向物件的資料結構表示
Java面向物件基礎
類的宣告與例項化
Java是面向物件的程式設計語言,類和物件是面向物件的核心。
在java中,自定義一個類的實質是自定義一種資料型別。因此,必須將類例項化之後才能引用類中的成員變數和成員方法。所謂“例項化”就是使用類宣告一個變數並通過new操作符以及構造器完成各成員變數的初始化。     
類的成員的定義與使用
類是資料以及資料的操作的封裝體。類的成員詳細描述了類的資料資訊(成員變數)以及針對這些資料資訊的操作方法(成員方法)。Java是面向物件的,方法不能獨立存在,所有的方法都必須定義在類之中。
類的成員在類的內部允許直接使用。但是,在類的外部引用類的成員通常必須使用物件名來引用,格式為:“物件.成員名”。
抽象類
在java中,類的成員方法用來完成類的成員變數的運算處理,因此通常擁有明確的可執行的語句程式碼。但是,當類表達的是抽象概念時,其運算也是抽象的,此時只能定義方法的格式,而無法寫出語句程式碼。
在java中,抽象類和抽象成員方法必須使用abstract來修飾。抽象方法不能有方法體。抽象類不能被例項化,無法使用new關鍵字來建立物件,但是抽象類可以作為父類被其他類繼承。抽象類的子類必須實現抽象類的抽象成員方法。
泛型類
泛型就是一種包含了要運算處理的資料的型別尚不明確而臨時使用型別引數來表示的一種自定義資料型別。
泛型類在使用時必須明確指定各型別引數對應的實際資料型別,java編譯器在編譯程式碼時將根據所指定的實際資料型別自動替換對應的型別引數。
使用Java語言描述資料結構的優勢
在Java中,使用類時必須先宣告變數名(也稱物件名),然後例項化,再引用類的成員。其中,例項化的本質是為物件分配足夠的記憶體空間,以儲存各資料成員的值。物件名代表物件的引用,可理解為物件所擁有的記憶體空間的首地址。因此,Java不使用指標就可以描述資料結構的前期後繼關係。
Java的泛型類定義了一個程式碼模板,專門針對暫時不確定的資料型別進行抽象描述和定義。
演算法的基本概念
是指在有限的時間範圍內,為解決某一問題而採取的方法和步驟的準確完整的描述,它是一個有窮的規則序列,這些規則決定了解決某一特定問題的一系列運算。
一個演算法的特徵:
有窮性
確定性
可行性
輸入
輸出
演算法效率的度量:
正確性
可讀性
健壯性
執行時間
佔用空間
演算法效率分析
時間複雜度(所需執行時間)和空間複雜度(所佔儲存空間)                  
線性表
線性表的邏輯結構
概念
是n個數據元素的有限序列,其元素可以是一個數、一個符號,也可以是由多個數據項組成的複合形式。
線性表中的資料元素也可以由多個數據項組成。例如圖書表中的一本書的基本資訊,稱為一條記錄。通常,把含有大量記錄的線性表稱為檔案。
對於同一個線性表,其中的資料元素必須具有相同特性,也就是說,同一線性表中的資料元素必須屬於同一種資料型別。
線上性表中,資料元素之間的相對位置關係可以與資料元素的值有關,也可以無關。當有關時,稱為有序線性表,即表中的元素按照其值的某種元素進行排列,否則,稱為無序線性表。
線性表的順序表示和實現
線性表的順序表示
即順序表
順序表的實現
通常用陣列來描述順序儲存結構。對於線性表,可以用一維陣列來實現。
在順序儲存結構的線性表中插入或刪除一個數據元素,其時間主要耗費在移動元素上。換句話說,移動元素的操作作為預估演算法時間複雜度的基本操作,對於新增和刪除操作,元素移動的次數不僅與表長有關,而且與插入和刪除的位置有關。假定在任何位置上插入和刪除元素都是等概率的,則插入和刪除一個數據元素,平均約移動表中一半元素,演算法add和remove的時間複雜度均為O(n)。
  
線性表的鏈式表示和實現
線性表的鏈式表示
線性表的鏈式儲存結構是用一組任意的儲存單元來存放線性表的資料元素,這組儲存單元可以是連續的,也可以是不連續的。
對每個資料元素,除了儲存本身的資訊之外(資料域),還需儲存一個指示其直接後繼存放位置的指標(指標域)。這兩部分資訊組成資料元素的儲存映像,稱為結點。
單鏈表
含有n個元素的線性表通過每個結點的指標域連結成一個連結串列,又由於此連結串列的每個結點中只有一個指向後繼的指標,所以稱其為單鏈表或線性連結串列。
迴圈連結串列
特點是表中最後一個結點的指標域不再為空,而是指向表頭結點,整個連結串列形成一個環。由此,從表中任一結點出發均可找到連結串列中其他結點。
迴圈連結串列的操作與單鏈表基本一致,差別僅在於演算法中判斷到達表尾的條件不是p或p.next是否為空,而是它們是否等於頭指標。
雙向連結串列
以上鍊表,只有一個指向其後繼結點的指標域next,若已知某個結點,要找其前驅結點,則只能從表頭指標出發。也就是說,找後繼的時間複雜度為O(1),而找前驅的時間複雜度為O(n),如果希望找前驅的時間複雜度也為O(1),則需付出空間的代價,在每個結點中再設一個指向前驅的指標域,由這種特點組成的連結串列稱為雙向連結串列。
和單鏈表類似,雙向連結串列也可以有迴圈表。
棧和佇列

棧的定義及基本運算
棧是限定僅在表尾進行插入和刪除操作的線性表。允許插入、刪除的一端稱為棧頂,另一端稱為棧底,不含任何資料元素的棧稱為空棧。
獨木橋,原路返回
假設棧S=(a1,a2,…,an),則稱a1為棧底元素,an為棧頂元素。棧中元素按a1,a2…an的順序進棧,退棧從棧頂元素開始出棧。所以,棧的修改是按後進先出的原則進行的。因此,棧又稱為後進先出(LIFT,last in first out)的線性表。
入棧和出棧是棧的兩個主要操作,每一次進棧的元素總是稱為當前的棧頂元素,而每一次出棧的元素總是當前的棧頂元素。所以棧頂的位置隨元素的插入和刪除而變化,為此需要一個稱為棧頂指標的位置指示器來表示棧頂的當前位置。
順序棧
利用一組地址連續的儲存單元依次存放自棧底到棧頂的資料元素,把陣列中下標為0的一端作為棧底。
鏈棧
棧的鏈式儲存結構稱為鏈棧。利用連結串列實現。連結串列中的每個資料元素由兩部分資訊組成,一部分儲存資料元素資訊,稱為資料域;一部分儲存後繼儲存位置的的資訊,稱為指標域。鏈棧在結構上是連結串列的形式,在操作定義上依然是棧的定義,棧中元素後進的先出,先進的後出,第一個入棧的是棧底元素,最後的是棧頂元素。
對於鏈式棧,無棧滿問題,空間可擴充,插入和刪除僅在棧頂處執行,鏈式棧的棧頂在鏈頭。