自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

介紹常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表

大數(shù)據(jù)
常用的數(shù)據(jù)結(jié)構(gòu)有:數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表等。每一種數(shù)據(jù)結(jié)構(gòu)都有著獨特的數(shù)據(jù)存儲方式,下面為大家介紹它們的結(jié)構(gòu)和優(yōu)缺點。

常用的數(shù)據(jù)結(jié)構(gòu)有:數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表等。

每一種數(shù)據(jù)結(jié)構(gòu)都有著獨特的數(shù)據(jù)存儲方式,下面為大家介紹它們的結(jié)構(gòu)和優(yōu)缺點。

1、數(shù)組

 

介紹常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表

數(shù)組是可以再內(nèi)存中連續(xù)存儲多個元素的結(jié)構(gòu),在內(nèi)存中的分配也是連續(xù)的,數(shù)組中的元素通過數(shù)組下標進行訪問,數(shù)組下標從0開始。例如下面這段代碼就是將數(shù)組的第一個元素賦值為 1。

優(yōu)點:

  • 按照索引查詢元素速度快
  • 按照索引遍歷數(shù)組方便

缺點:

  • 數(shù)組的大小固定后就無法擴容了
  • 數(shù)組只能存儲一種類型的數(shù)據(jù)
  • 添加,刪除的操作慢,因為要移動其他的元素。

適用場景:

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

2、棧

 

介紹常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表

棧是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。 棧的特點是:先進后出,或者說是后進先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧。

棧的結(jié)構(gòu)就像一個集裝箱,越先放進去的東西越晚才能拿出來,所以,棧常應(yīng)用于實現(xiàn)遞歸功能方面的場景,例如斐波那契數(shù)列。

3、隊列

 

介紹常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表

隊列與棧一樣,也是一種線性表,不同的是,隊列可以在一端添加元素,在另一端取出元素,也就是:先進先出。從一端放入元素的操作稱為入隊,取出元素為出隊,示例圖如下:

使用場景:因為隊列先進先出的特點,在多線程阻塞隊列管理中非常適用。

4、鏈表

 

介紹常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表

鏈表是物理存儲單元上非連續(xù)的、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表的指針地址實現(xiàn),每個元素包含兩個結(jié)點,一個是存儲元素的數(shù)據(jù)域 (內(nèi)存空間),另一個是指向下一個結(jié)點地址的指針域。根據(jù)指針的指向,鏈表能形成不同的結(jié)構(gòu),例如單鏈表,雙向鏈表,循環(huán)鏈表等。

鏈表的優(yōu)點:

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

缺點:

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

適用場景:

  • 數(shù)據(jù)量較小,需要頻繁增加,刪除操作的場景

5、樹

 

介紹常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表

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

  • 每個節(jié)點有零個或多個子節(jié)點;
  • 沒有父節(jié)點的節(jié)點稱為根節(jié)點;
  • 每一個非根節(jié)點有且只有一個父節(jié)點;
  • 除了根節(jié)點外,每個子節(jié)點可以分為多個不相交的子樹;
  • 在日常的應(yīng)用中,我們討論和用的更多的是樹的其中一種結(jié)構(gòu),就是二叉樹。

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

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

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

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

6、散列表

 

介紹常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表

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

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

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

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

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

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

7、堆

 

介紹常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表

堆是一種比較特殊的數(shù)據(jù)結(jié)構(gòu),可以被看做一棵樹的數(shù)組對象,具有以下的性質(zhì):

  • 堆中某個節(jié)點的值總是不大于或不小于其父節(jié)點的值;
  • 堆總是一棵完全二叉樹。
  • 將根節(jié)點最大的堆叫做最大堆或大根堆,根節(jié)點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。

堆的定義如下:n個元素的序列{k1,k2,ki,…,kn}當且僅當滿足下關(guān)系時,稱之為堆。

(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),滿足前者的表達式的成為小頂堆,滿足后者表達式的為大頂堆,這兩者的結(jié)構(gòu)圖可以用完全二叉樹排列出來,示例圖如下:

  • 因為堆有序的特點,一般用來做數(shù)組中的排序,稱為堆排序。

8、圖

 

介紹常用的數(shù)據(jù)結(jié)構(gòu):數(shù)組,棧,鏈表,隊列,樹,圖,堆,散列表

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

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

以上所描述的都是數(shù)據(jù)結(jié)構(gòu)的皮毛知識,如果想深入了解必須靜心學(xué)習(xí)。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2020-11-06 12:48:16

數(shù)據(jù)結(jié)構(gòu)算法分析

2020-10-28 10:10:03

Java單鏈表數(shù)據(jù)結(jié)構(gòu)

2020-12-17 10:12:33

數(shù)據(jù)結(jié)構(gòu)算法隊列

2021-08-03 10:24:59

數(shù)據(jù)跳躍鏈表結(jié)構(gòu)

2024-01-15 06:01:36

C++數(shù)組

2021-05-12 14:09:35

鏈表數(shù)據(jù)結(jié)構(gòu)線性結(jié)構(gòu)

2011-04-11 11:23:17

隊列數(shù)據(jù)結(jié)構(gòu)

2012-05-16 17:05:33

Java數(shù)據(jù)結(jié)構(gòu)

2012-04-28 14:21:47

Java數(shù)據(jù)結(jié)構(gòu)線性結(jié)構(gòu)

2021-01-06 08:03:00

JavaScript數(shù)據(jù)結(jié)構(gòu)

2009-08-13 18:34:49

C#數(shù)據(jù)結(jié)構(gòu)和算法

2021-07-16 07:57:34

Python數(shù)據(jù)結(jié)構(gòu)

2019-09-18 08:31:47

數(shù)據(jù)結(jié)構(gòu)設(shè)計

2021-07-15 06:43:12

Python數(shù)據(jù)結(jié)構(gòu)

2017-03-01 13:58:46

Python數(shù)據(jù)結(jié)構(gòu)鏈表

2021-07-13 07:52:03

Python數(shù)據(jù)結(jié)構(gòu)

2021-01-28 07:33:34

JavaScript鏈表數(shù)據(jù)

2023-03-28 07:44:23

數(shù)據(jù)結(jié)構(gòu)數(shù)組

2016-10-09 08:57:11

python數(shù)據(jù)結(jié)構(gòu)與算法樹形結(jié)構(gòu)

2017-09-06 10:55:19

Java
點贊
收藏

51CTO技術(shù)棧公眾號