數據結構(java語言描述)


  概念性描述與《數據結構實例教程》大同小異,具體參考:http://www.cnblogs.com/bookwed/p/6763300.html。

  1. 概述
    1. 基本概念及術語
      1. 數據
        1. 信息的載體,是對客觀事物的符號表示,凡能輸入到計算機中並被計算機程序處理的符號都可稱為數據。
      2. 數據元素
        1. 是數據的基本單位,它在計算機處理和程序設計中通常作為獨立個體。數據元素一般由一個或多個數據項組成,一個數據元素包含多個數據項時,常稱為記錄、結點等。數據項也稱為域、字段、屬性、表目、頂點。
        2. 如數據庫中的一行就是一個數據元素,每個字段又叫數據項。
      3. 數據對象
        1. 是具有相同特征的數據元素的集合,是數據的一個子集,如一個整型數組、一個字符串數組都是一個數組對象。
      4. 數據結構
        1. 簡稱DS(Data Structure),是數據及數據元素的組織形式。任何數據都不是彼此孤立的,通常把相關聯的數據按照一定的邏輯關系組織起來,這樣就形成了一個數據結構。
        2. 數據結構包含兩方面的內容,一是數據對象,二是數據對象中數據元素之間內在的關系,通常有四類基本形式:集合結構、線性結構、樹型結構、圖型結構或網狀結構。
        3. 集合結構:(參考:http://www.cnblogs.com/bookwed/p/6763300.html)
        4. 線性結構
        5. 樹型結構
        6. 圖型結構
      5. 數據類型
        1. 是一組具有相同性質的操作對象以及該組操作對象上的運算方法的集合。每一種數據類型都有自身特點的一組操作方法,即運算規則。Java提供的基本數據類型有:byte、short、int、long、float、double、boolean、char。
        2. 基本數據類型:在棧中可以直接分配內存;引用數據類型:數據的引用在棧中,但是它的對象在堆中。
    2. 數據的邏輯結構
      1. 從具體問題抽象出來的數學模型,與數據在計算機中的具體存儲沒有關系,獨立於計算機,是數據本身所固有的屬性。
      2. 從邏輯上可以把數據結構分為線性結構和非線性結構。主要有:集合、線性、樹和圖形數據結構,其中集合、樹、圖都屬於非線性結構。
      3. 數據的邏輯結構有兩個要素:一是數據元素的集合,通常記為D;二是D上的關系集,它反映了D中各數據元素之間的前驅后繼關系。通常記為R,即一個數據結構可以表示成二元組B=(D,R)。
      4. 如一年四季可以表示成B1=(D1,R1),其中D1={春,夏,秋,冬},R1={<春,夏>,<夏,秋>,<秋,冬>};注意,<x,y>意為x和y之間存在“x領先於y”的次序關系。而(x,y)表示x和y之間沒有次序上的關系。
    3. 數據的物理結構
      1. 又稱存儲結構,主要研究在計算機中如何表示和存儲數據結構。分:順序和鏈式兩種,順序存儲的特點是數據元素在存儲器的相對位置來體現數據元素相互間的邏輯關系,順序存儲結構通常用高級編程語言中的一維數組來描述或實現。
      2. 鏈式存儲結構是通過一組任意的存儲單元來存儲數據元素的,而這些存儲單元可以是連續的,也可以是不連續的。
      3. 在順序存儲結構的基礎上,又可延伸出兩種,即索引存儲和散列存儲。
      4. 索引存儲就是在數據文件的基礎上增加了一個索引表文件。通過索引表建立索引,可以把一個順序表分成幾個順序子表,其目的是在查詢時提高查找效率,避免盲目查找。
      5. 散列存儲就是通過數據元素與存儲地址之間建立起某種映射關系,使每個數據元素與每一個存儲地址之間盡量達到一一對應的目的。這樣,查找時可以大大提高效率。
    4. 面向對象的數據結構表示
      1. Java面向對象基礎
        1. 類的聲明與實例化
          1. Java是面向對象的程序設計語言,類和對象是面向對象的核心。
          2. 在java中,自定義一個類的實質是自定義一種數據類型。因此,必須將類實例化之后才能引用類中的成員變量和成員方法。所謂“實例化”就是使用類聲明一個變量並通過new操作符以及構造器完成各成員變量的初始化。     
        2. 類的成員的定義與使用
          1. 類是數據以及數據的操作的封裝體。類的成員詳細描述了類的數據信息(成員變量)以及針對這些數據信息的操作方法(成員方法)。Java是面向對象的,方法不能獨立存在,所有的方法都必須定義在類之中。
          2. 類的成員在類的內部允許直接使用。但是,在類的外部引用類的成員通常必須使用對象名來引用,格式為:“對象.成員名”。
        3. 抽象類
          1. 在java中,類的成員方法用來完成類的成員變量的運算處理,因此通常擁有明確的可執行的語句代碼。但是,當類表達的是抽象概念時,其運算也是抽象的,此時只能定義方法的格式,而無法寫出語句代碼。
          2. 在java中,抽象類和抽象成員方法必須使用abstract來修飾。抽象方法不能有方法體抽象類不能被實例化,無法使用new關鍵字來創建對象,但是抽象類可以作為父類被其他類繼承。抽象類的子類必須實現抽象類的抽象成員方法。
        4. 泛型類
          1. 泛型就是一種包含了要運算處理的數據的類型尚不明確而臨時使用類型參數來表示的一種自定義數據類型。
          2. 泛型類在使用時必須明確指定各類型參數對應的實際數據類型,java編譯器在編譯代碼時將根據所指定的實際數據類型自動替換對應的類型參數。
      2. 使用Java語言描述數據結構的優勢
        1. 在Java中,使用類時必須先聲明變量名(也稱對象名),然后實例化,再引用類的成員。其中,實例化的本質是為對象分配足夠的內存空間,以保存各數據成員的值。對象名代表對象的引用,可理解為對象所擁有的內存空間的首地址。因此,Java不使用指針就可以描述數據結構的前期后繼關系。
        2. Java的泛型類定義了一個代碼模板,專門針對暫時不確定的數據類型進行抽象描述和定義。
    5. 算法的基本概念
      1. 是指在有限的時間范圍內,為解決某一問題而采取的方法和步驟的准確完整的描述,它是一個有窮的規則序列,這些規則決定了解決某一特定問題的一系列運算。
      2. 一個算法的特征:
        1. 有窮性
        2. 確定性
        3. 可行性
        4. 輸入
        5. 輸出
      3. 算法效率的度量:
        1. 正確性
        2. 可讀性
        3. 健壯性
        4. 運行時間
        5. 占用空間
      4. 算法效率分析
        1. 時間復雜度(所需運行時間)和空間復雜度(所占存儲空間)                  
  2. 線性表
    1. 線性表的邏輯結構
      1. 概念
        1. 是n個數據元素的有限序列,其元素可以是一個數、一個符號,也可以是由多個數據項組成的復合形式。
        2. 線性表中的數據元素也可以由多個數據項組成。例如圖書表中的一本書的基本信息,稱為一條記錄。通常,把含有大量記錄的線性表稱為文件
        3. 對於同一個線性表,其中的數據元素必須具有相同特性,也就是說,同一線性表中的數據元素必須屬於同一種數據類型。
        4. 在線性表中,數據元素之間的相對位置關系可以與數據元素的值有關,也可以無關。當有關時,稱為有序線性表,即表中的元素按照其值的某種元素進行排列,否則,稱為無序線性表。
    2. 線性表的順序表示和實現
      1. 線性表的順序表示
        1. 即順序表
        2. 順序表的實現
          1. 通常用數組來描述順序存儲結構。對於線性表,可以用一維數組來實現。
          2. 在順序存儲結構的線性表中插入或刪除一個數據元素,其時間主要耗費在移動元素上。換句話說,移動元素的操作作為預估算法時間復雜度的基本操作,對於新增和刪除操作,元素移動的次數不僅與表長有關,而且與插入和刪除的位置有關。假定在任何位置上插入和刪除元素都是等概率的,則插入和刪除一個數據元素,平均約移動表中一半元素,算法add和remove的時間復雜度均為O(n)。
      2.   
    3. 線性表的鏈式表示和實現
      1. 線性表的鏈式表示
        1. 線性表的鏈式存儲結構是用一組任意的存儲單元來存放線性表的數據元素,這組存儲單元可以是連續的,也可以是不連續的。
        2. 對每個數據元素,除了存儲本身的信息之外(數據域),還需存儲一個指示其直接后繼存放位置的指針(指針域)。這兩部分信息組成數據元素的存儲映像,稱為結點。
      2. 單鏈表
        1. 含有n個元素的線性表通過每個結點的指針域鏈接成一個鏈表,又由於此鏈表的每個結點中只有一個指向后繼的指針,所以稱其為單鏈表線性鏈表
      3. 循環鏈表
        1. 特點是表中最后一個結點的指針域不再為空,而是指向表頭結點,整個鏈表形成一個環。由此,從表中任一結點出發均可找到鏈表中其他結點。
        2. 循環鏈表的操作與單鏈表基本一致,差別僅在於算法中判斷到達表尾的條件不是p或p.next是否為空,而是它們是否等於頭指針。
      4. 雙向鏈表
        1. 以上鏈表,只有一個指向其后繼結點的指針域next,若已知某個結點,要找其前驅結點,則只能從表頭指針出發。也就是說,找后繼的時間復雜度為O(1),而找前驅的時間復雜度為O(n),如果希望找前驅的時間復雜度也為O(1),則需付出空間的代價,在每個結點中再設一個指向前驅的指針域,由這種特點組成的鏈表稱為雙向鏈表
        2. 和單鏈表類似,雙向鏈表也可以有循環表。
  3. 棧和隊列
      1. 棧的定義及基本運算
        1. 棧是限定僅在表尾進行插入和刪除操作的線性表。允許插入、刪除的一端稱為棧頂,另一端稱為棧底,不含任何數據元素的棧稱為空棧。
        2. 獨木橋,原路返回
        3. 假設棧S=(a1,a2,...,an),則稱a1為棧底元素,an為棧頂元素。棧中元素按a1,a2...an的順序進棧,退棧從棧頂元素開始出棧。所以,棧的修改是按后進先出的原則進行的。因此,棧又稱為后進先出(LIFT,last in first out)的線性表
        4. 入棧和出棧是棧的兩個主要操作,每一次進棧的元素總是稱為當前的棧頂元素,而每一次出棧的元素總是當前的棧頂元素。所以棧頂的位置隨元素的插入和刪除而變化,為此需要一個稱為棧頂指針的位置指示器來表示棧頂的當前位置。
      2. 順序棧
        1. 利用一組地址連續的存儲單元依次存放自棧底到棧頂的數據元素,把數組中下標為0的一端作為棧底。
      3. 鏈棧
        1. 棧的鏈式存儲結構稱為鏈棧。利用鏈表實現。鏈表中的每個數據元素由兩部分信息組成,一部分存儲數據元素信息,稱為數據域;一部分存儲后繼存儲位置的的信息,稱為指針域。鏈棧在結構上是鏈表的形式,在操作定義上依然是棧的定義,棧中元素后進的先出,先進的后出,第一個入棧的是棧底元素,最后的是棧頂元素。
        2. 對於鏈式棧,無棧滿問題,空間可擴充,插入和刪除僅在棧頂處執行,鏈式棧的棧頂在鏈頭。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM