數據結構(計算機存儲、組織數據方式)


 

數據結構含義

  數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法和索引技術有關。

  內容解釋:

數據:數據(data)是事實或觀察的結果,是對客觀事物的邏輯歸納,是用於表示客觀事物的未經加工的的原始素材。

數據的實質:事實或觀察的結果
數據的意義:信息的表現形式和載體

數據是指對客觀事件進行記錄並可以鑒別的符號,是對客觀事物的性質、狀態以及相互關系等進行記載的物理符號或這些物理符號的組合。它是可識別的、抽象的符號。

它不僅指狹義上的數字,還可以是具有一定意義的文字、字母、數字符號的組合、圖形、圖像、視頻、音頻等,也是客觀事物的屬性、數量、位置及其相互關系的抽象表示。例如,“012...`”、“陰、雨、下降、氣溫”“學生的檔案記錄、貨物的運輸情況”等都是數據。數據經過加工后就成為信息。

在計算機科學中,數據是指所有能輸入到計算機並被計算機程序處理的符號的介質的總稱,是用於輸入電子計算機進行處理,具有一定意義的數字、字母、符號和模擬量等的通稱。現在計算機存儲和處理的對象十分廣泛,表示這些對象的數據也隨之變得越來越復雜。

信息與數據既有聯系,又有區別。
數據是信息的表現形式和載體,可以是符號、文字、數字、語音、圖像、視頻等。而信息是數據的內涵,信息是加載於數據之上,對數據作具有含義的解釋。
數據和信息是不可分離的,信息依賴數據來表達,數據則生動具體表達出信息。
數據是符號,是物理性的,信息是對數據進行加工處理之后所得到的並對決策產生影響的數據,是邏輯性和觀念性的。
數據是信息的表現形式,信息是數據有意義的表示。數據是信息的表達、載體,信息是數據的內涵,是形與質的關系。
數據本身沒有意義,數據只有對實體行為產生影響時才成為信息。
數據詳解

 

 數據元素:數據元素(data element)是計算機科學術語。它是數據的基本單位,數據元素也叫做結點或記錄。在計算機程序中通常作為一個整體進行考慮和處理。有時,一個數據元素可由若干個數據項組成,例如,一本書的書目信息為一個數據元素,而書目信息的每一項(如書名、作者名等)為一個數據項。數據項是數據的不可分割的最小單位。

 

數據結構的研究對象

一、數據的邏輯結構:

指反映數據元素之間的邏輯關系的數據結構,其中的邏輯關系是指數據元素之間的前后件關系,而與他們在計算機中的存儲位置無關。

邏輯關系(logic relationship)即“依賴關系”。
在項目管理中,指表示兩個活動(前導活動和后續活動)中一個活動的變更將會影響到另一個活動的關系。
通常活動之間的依賴關系包括強制依賴關系(所做工作中固有的依賴關系)、可自由處理的依賴關系(由項目隊伍確定的依賴關系)和外部依賴關系(項目活動與非項目活動之間的依賴關系)三種形式

三種邏輯關系解釋:
硬邏輯、強制性依賴關系(Mandatory Dependencies)
是指所做工作中固有的依賴關系,也稱為邏輯硬邏輯關系(Hard Logic)

軟邏輯、任意的依賴關系(Discretionary Dependencies)
是指由項目團隊確定的那些依賴關系,也稱為軟邏輯關系(Soft Logic)

外部邏輯、外部依賴關系(External Dependencies)
是指受項目外部因素制約的那些依賴關系

用雞蛋炒韭菜解釋三種邏輯關系:
韭菜要先切后炒,叫硬邏輯關系;
韭菜雞蛋單炒,一般人最佳實踐先炒雞蛋,這叫軟邏輯關系;
要做這道菜卻沒雞蛋,等雞下蛋后,才能做,這叫外部邏輯關系。

硬邏輯:必須先蓋下層,才能蓋上層 
外部邏輯:依賴於其他因素,如只有天氣合適,才適合滑雪 
軟邏輯:可以先高爾夫,再游泳,也可反之進行
邏輯關系
1.集合
數據結構中的元素之間除了“同屬一個集合” 的相互關系外,別無其他關系;
2.線性結構
數據結構中的元素存在一對一的相互關系;
3.樹形結構
數據結構中的元素存在一對多的相互關系;
4.圖形結構
數據結構中的元素存在多對多的相互關系。
邏輯結構包含什么

 

 二、數據的物理結構:

指數據的邏輯結構在計算機存儲空間的存放形式。數據的物理結構是數據結構在計算機中的表示(又稱映像),它包括數據元素的機內表示關系的機內表示。由於具體實現的方法有順序、鏈接、索引、散列等多種,所以,一種數據結構可表示成一種或多種存儲結構。

數據元素的機內表示(映像方法): 用二進制位(bit)的位串表示數據元素。通常稱這種位串為節點(node)。當數據元素有若干個數據項組成時,位串中與個數據項對應的子位串稱為數據域(data field)。因此,節點是數據元素的機內表示(或機內映像)。

關系的機內表示(映像方法):數據元素之間的關系的機內表示可以分為順序映像和非順序映像,常用兩種存儲結構:順序存儲結構和鏈式存儲結構。順序映像借助元素在存儲器中的相對位置來表示數據元素之間的邏輯關系。非順序映像借助指示元素存儲位置的指針(pointer)來表示數據元素之間的邏輯關系。
數據結構在計算機中的表示

 

 如果上文“數據結構在計算機中的表示”看不懂,應該可以這樣理解(我也看不懂):數據元素的機內表示就是拿二進制在電腦里存數據,關系的機內表示就是像用數組(順序存儲結構、順序映像)或鏈表(鏈式存儲結構、非順序映像)存數據的數據處理方式。

 

常用結構

每一種數據結構都有着獨特的數據存儲方式,下面為大家介紹它們的結構和優缺點。

 

1.數組

在程序設計中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數據元素的集合稱為數組。在C語言中, 數組屬於構造數據類型。一個數組可以分解為多個數組元素,這些數組元素可以是基本數據類型或是構造類型。因此按數組元素的類型不同,數組又可分為數值數組、字符數組、指針數組、結構數組等各種類別。
 
數組是可以再內存中連續存儲多個元素的結構,在內存中的 分配也是連續的,數組中的元素通過數組下標進行訪問,數組 下標從0開始。例如下面這段代碼就是將數組的第一個元素賦值為 1。
 1 #include<iostream>
 2 using namespace std;
 3 
 4 int array[100];
 5 
 6 int main(){
 7 
 8     array[0]=1;
 9 
10     return 0;
11 }
將數組的第一個元素賦值為 1

優點: 
1、按照索引查詢元素速度快 
2、按照索引遍歷數組方便

缺點: 
1、數組的大小固定后就無法擴容了 
2、數組只能存儲一種類型的數據 
3、添加,刪除的操作慢,因為要移動其他的元素。

適用場景: 
頻繁查詢,對存儲空間要求不大,很少增加和刪除的情況。

 

 

2.棧

是只能在某一端插入和刪除的特殊線性表。它按照 先進后出的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后一個數據被第一個讀出來)。
 

棧的結構就像一個集裝箱,越先放進去的東西越晚才能拿出來,所以,棧常應用於實現遞歸功能方面的場景,例如斐波那契數列。

 

3.隊列

一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列是按照 “先進先出”或“后進后出”的原則組織數據的。隊列中沒有元素時,稱為空隊列。
 
使用場景:因為隊列先進先出的特點,在多線程阻塞隊列管理中非常適用。 
 

4.鏈表

是一種物理存儲單元上 非連續、非順序的存儲結構,它既可以表示線性結構,也可以用於表示非線性結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。根據指針的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,循環鏈表等。 
 

鏈表的優點:
鏈表是很常用的一種數據結構,不需要初始化容量,可以任意加減元素;
添加或者刪除元素時只需要改變前后兩個元素結點的指針域指向地址即可,所以添加,刪除很快;

缺點:
因為含有大量的指針域,占用空間較大;
查找元素需要遍歷鏈表來查找,非常耗時。

適用場景:
數據量較小,需要頻繁增加,刪除操作的場景

 

5.樹

樹是一種數據結構,它是由n(n>=1)個有限節點組成一個具有層次關系的集合。把它叫做 “樹” 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點:

  • 每個節點有零個或多個子節點;
  • 沒有父節點的節點稱為根節點;
  • 每一個非根節點有且只有一個父節點;
  • 除了根節點外,每個子節點可以分為多個不相交的子樹;

在日常的應用中,我們討論和用的更多的是樹的其中一種結構,就是二叉樹。

二叉樹是樹的特殊一種,具有如下特點:

  • 每個結點最多有兩顆子樹,結點的度最大為2。
  • 左子樹和右子樹是有順序的,次序不能顛倒。
  • 即使某結點只有一個子樹,也要區分左右子樹。

二叉樹是一種比較有用的折中方案,它添加,刪除元素都很快,並且在查找方面也有很多的算法優化,所以,二叉樹既有鏈表的好處,也有數組的好處,是兩者的優化方案,在處理大批量的動態數據方面非常有用。

擴展:
二叉樹有很多擴展的數據結構,包括平衡二叉樹、紅黑樹、B+樹等,這些數據結構二叉樹的基礎上衍生了很多的功能,在實際應用中廣泛用到,例如mysql的數據庫索引結構用的就是B+樹,還有HashMap的底層源碼中用到了紅黑樹。這些二叉樹的功能強大,但算法上比較復雜,想學習的話還是需要花時間去深入的。

 

 

6.圖

圖是由結點的有窮集合V和邊的集合E組成。其中,為了與樹形結構加以區別,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關系。

按照頂點指向的方向可分為無向圖和有向圖: 

圖是一種比較復雜的數據結構,在存儲數據上有着比較復雜和高效的算法,分別有鄰接矩陣 、鄰接表、十字鏈表、鄰接多重表、邊集數組等存儲結構,這里不做展開,讀者有興趣可以自己學習深入。

 

 

7.堆

堆是一種比較特殊的數據結構,可以被看做一棵樹的數組對象,具有以下的性質:

  • 堆中某個節點的值總是不大於或不小於其父節點的值;
  • 堆總是一棵完全二叉樹。

將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。

堆的定義如下:n個元素的序列{k1,k2,ki,…,kn}當且僅當滿足下關系時,稱之為堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),滿足前者的表達式的成為小頂堆,滿足后者表達式的為大頂堆,這兩者的結構圖可以用完全二叉樹排列出來,示例圖如下:
因為堆有序的特點,一般用來做數組中的排序,稱為堆排序。

 

 

8.散列表

散列表,也叫哈希表,是根據關鍵碼和值 (key和value) 直接進行訪問的數據結構,通過key和value來映射到集合中的一個位置,這樣就可以很快找到集合中的對應元素。

記錄的存儲位置=f(key)

這里的對應關系 f 成為散列函數,又稱為哈希 (hash函數),而散列表就是把Key通過一個固定的算法函數既所謂的哈希函數轉換成一個整型數字,然后就將該數字對數組長度進行取余,取余結果就當作數組的下標,將value存儲在以該數字為下標的數組空間里,這種存儲空間可以充分利用數組的查找優勢來查找元素,所以查找的速度很快。

哈希表在應用中也是比較常見的,就如Java中有些集合類就是借鑒了哈希原理構造的,例如HashMap,HashTable等,利用hash表的優勢,對於集合的查找元素時非常方便的,然而,因為哈希表是基於數組衍生的數據結構,在添加刪除元素方面是比較慢的,所以很多時候需要用到一種數組鏈表來做,也就是拉鏈法。拉鏈法是數組結合鏈表的一種結構,較早前的hashMap底層的存儲就是采用這種結構,直到jdk1.8之后才換成了數組加紅黑樹的結構,其示例圖如下:

從圖中可以看出,左邊很明顯是個數組,數組的每個成員包括一個指針,指向一個鏈表的頭,當然這個鏈表可能為空,也可能元素很多。我們根據元素的一些特征把元素分配到不同的鏈表中去,也是根據這些特征,找到正確的鏈表,再從鏈表中找出這個元素。

哈希表的應用場景很多,當然也有很多問題要考慮,比如哈希沖突的問題,如果處理的不好會浪費大量的時間,導致應用崩潰。

 

 

文章內容摘抄於:

數據結構基礎概念篇 - 小草莓的博客 - CSDN

博客數據結構_百度百科

數據(計算機術語)_百度百科

數據元素_百度百科

邏輯關系_百度百科

一次性把三種依賴關系說清楚,PMP知識點_記得忘記_新浪博客

數據結構:八大數據結構分類 - 薛嘉濤的博客 - CSDN博客


免責聲明!

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



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