数据结构简介
數據結構(Data Structure)是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法和索引技術有關。
數據結構定義
數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成。記為:
Data_Structure=(D,R)其中?D?是數據元素的集合,R?是該集合中所有元素之間的關系的有限集合。
數據結構具體指同一類數據元素中各元素之間的相互關系,包括三個組成成分,數據的邏輯結構、存儲結構和數據運算結構。
數據的邏輯結構
數據的邏輯結構是指反映數據元素之間的邏輯關系的數據結構,其中的邏輯關系是指數據元素之間的前后件關系,而與他們在計算機中的存儲位置無關。邏輯結構分為以下幾種:
-
集合結構:數據元素同屬一個集合,單個數據元素之間沒有任何關系。
-
線性結構:數據結構中的元素存在一對一的相互關系。
-
樹形結構:數據結構中的元素存在一對多的相互關系。
-
圖形結構:數據結構中的元素存在多對多的相互關系。
數據的物理結構
數據的物理結構是指數據的邏輯結構在計算機存儲空間的存放形式,它包括數據元素的機內表示和關系的機內表示。物理結構又叫存儲結構,分為以下幾種:
-
順序存儲結構:一段連續的內存空間。優點:隨機訪問;缺點:插入刪除效率低,大小固定。
-
鏈式存儲結構:不連續的內存空間。優點:大小動態擴展,插入刪除效率高;缺點:不能隨機訪問。
-
索引存儲結構:為了方便查找,整體無序,但索引塊之間有序,需要額外空間,存儲索引表。優點:對順序查找的一種改進,查找效率高;缺點:需額外空間存儲索引。
-
散列存儲結構:選取某個函數,數據元素根據函數計算存儲位置可能存在多個數據元素存儲在同一位置,引起地址沖。優點:查找基于數據本身即可找到,查找效率高,存取效率高;缺點:存取隨機,不便于順序查找。
由于具體實現的方法有順序、鏈接、索引、散列等多種,所以,一種數據結構可表示成一種或多種存儲結構。
數據結構算法
數據結構算法的設計取決于數據的邏輯結構,而算法的實現依賴于采用的存儲結構。數據的存儲結構實質上是它的邏輯結構在計算機存儲器中的實現,為了全面的反映一個數據的邏輯結構,它在存儲器中的映象包括兩方面內容,即數據元素之間的信息和數據元素之間的關系。不同數據結構有其相應的若干運算。數據的運算是在數據的邏輯結構上定義的操作算法,如檢索、插入、刪除、更新和排序等。
數據的運算是數據結構的一個重要方面,討論任一種數據結構時都離不開對該結構上的數據運算及其實現算法的討論。
數據結構不同于數據類型,也不同于數據對象,它不僅要描述數據類型的數據對象,而且要描述數據對象各元素之間的相互關系。
數據類型是一個值的集合和定義在這個值集上的一組操作的總稱。數據類型可分為兩類:原子類型、結構類型。一方面,在程序設計語言中,每一個數據都屬于某種數據類型。類型明顯或隱含地規定了數據的取值范圍、存儲方式以及允許進行的運算。可以認為,數據類型是在程序設計中已經實現了的數據結構。另一方面,在程序設計過程中,當需要引入某種新的數據結構時,總是借助編程語言所提供的數據類型來描述數據的存儲結構。
對每一個數據結構而言,必定存在與它密切相關的一組操作。若操作的種類和數目不同,即使邏輯結構相同,數據結構能起的作用也不同。不同的數據結構其操作集不同,但下列操作必不可缺:
結構的生成;
結構的銷毀;
在結構中查找滿足規定條件的數據元素;
在結構中插入新的數據元素;
刪除結構中已經存在的數據元素;
遍歷。
數據結構分類
每一種數據結構都有著獨特的數據存儲方式,常用的數據結構有:數組、棧、鏈表、隊列、樹、圖、堆、散列表等,如圖所示:
數據結構分類
數組
數組是可以再內存中連續存儲多個元素的結構,在內存中的分配也是連續的,數組中的元素通過數組下標進行訪問,數組下標從0開始。
-
優點:
-
按照索引查詢元素速度快
-
按照索引遍歷數組方便
-
-
缺點:
-
數組的大小固定后就無法擴容了
-
數組只能存儲一種類型的數據
-
添加,刪除的操作慢,因為要移動其他的元素。
-
適用場景:查詢頻繁,對存儲空間要求不大,很少增加和刪除的情況。
棧
棧是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。棧的特點是先進后出,或者說是后進先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧。
棧的結構就像一個集裝箱,越先放進去的東西越晚才能拿出來,所以,棧常應用于實現遞歸功能方面的場景,例如斐波那契數列。
隊列
隊列與棧一樣也是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作。隊列的特點是先進先出,或者說是后進后出,進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭,從一端放入元素的操作稱為入隊,取出元素為出隊。隊列中沒有元素時,稱為空隊列。
使用場景:因為隊列先進先出的特點,在多線程阻塞隊列管理中非常適用。
鏈表
鏈表是物理存儲單元上非連續、非順序的存儲結構,它既可以表示線性結構,也可以用于表示非線性結構,數據元素的邏輯順序是通過鏈表的指針地址實現。數據結構簡介鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。根據指針的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,循環鏈表等。
-
鏈表的優點:
-
鏈表是很常用的一種數據結構,不需要初始化容量,可以任意加減元素;
-
添加或者刪除元素時只需要改變前后兩個元素結點的指針域指向地址即可,所以添加,刪除很快;
-
-
缺點:
-
因為含有大量的指針域,占用空間較大;
-
查找元素需要遍歷鏈表來查找,非常耗時。
-
適用場景:數據量較小,需要頻繁增加,刪除操作的場景。
樹
樹是由n(n>0)個有限節點組成一個具有層次關系的集合。把它叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:
-
有且僅有一個根結點(沒有父節點的節點稱為根節點);
-
每個節點有零個或多個子節點;
-
每一個非根節點有且只有一個父節點;
-
除了根節點外,每個子節點可以分為多個不相交的子樹;
在日常的應用中,我們討論和用的更多的是樹的其中一種結構,就是二叉樹。二叉樹是樹的特殊一種,具有如下特點:
-
每個結點最多有兩顆子樹,結點的度最大為2。
-
左子樹和右子樹是有順序的,次序不能顛倒。
-
即使某結點只有一個子樹,也要區分左右子樹。
二叉樹是一種比較有用的折中方案,它添加,刪除元素都很快,并且在查找方面也有很多的算法優化,所以,二叉樹既有鏈表的好處,也有數組的好處,是兩者的優化方案,在處理大批量的動態數據方面非常有用。
堆
堆是一種特殊的樹形數據結構,每個結點都有一個值。堆的特點是根結點的值最小或最大,且根結點的兩個子樹也是一個堆。它具有以下的特點:
-
堆中某個節點的值總是不大于或不小于其父節點的值;
-
堆總是一棵完全二叉樹。
將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。因為堆有序的特點,一般用來做數組中的排序,稱為堆排序。
圖
圖是由結點的有窮集合 V 和邊的集合 E 組成。其中,為了與樹形結構加以區別,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關系。
按照頂點指向的方向可分為無向圖和有向圖。圖是一種比較復雜的數據結構,在存儲數據上有著比較復雜和高效的算法,分別有鄰接矩陣 、鄰接表、十字鏈表、鄰接多重表、邊集數組等存儲結構。
散列表
散列表也叫哈希表,是根據鍵和值(key 和 value)直接進行訪問的數據結構,通過?key?和?value?來映射到集合中的一個位置,這樣就可以很快找到集合中的對應元素。
f(key)?稱為散列函數或哈希函數,用來記錄數據的存儲位置,若結構中存在鍵和?key?相等的記錄,則必定在?f(K)?的存儲位置上。而散列表就是把?key?通過一個固定的算法函數(哈希函數)轉換成一個整型數字,然后就將該數字對數組長度進行取余,取余結果就當作數組的下標,將?value?存儲在以該數字為下標的數組空間里,這種存儲空間可以充分利用數組的查找優勢來查找元素,所以查找的速度很快。
哈希表在應用中也是比較常見的,就如 Java 中有些集合類就是借鑒了哈希原理構造的,例如?HashMap、Hashtable?等,利用哈希表的優勢,對于集合的查找元素時非常方便的,然而,因為哈希表是基于數組衍生的數據結構,在添加刪除元素方面是比較慢的,所以很多時候需要用到一種數組鏈表來做,也就是拉鏈法。拉鏈法是數組結合鏈表的一種結構,較早前的?HashMap?底層的存儲就是采用這種結構,直到 JDK 1.8 之后才換成了數組加紅黑樹的結構。
?
總結
- 上一篇: ChatGPT版Bing被调戏到生气发飙
- 下一篇: ChatGPT 紧急暂停 Bing 集成