女人夜夜春高潮爽A∨片传媒_国产精品VIDEOS麻豆_在线精品亚洲一区二区三区_亚洲熟妇无码av

編程代碼
新聞詳情

常見的8種數據結構

發布時間:2020-01-06 08:40:09 最后更新:2020-11-23 14:46:28 瀏覽次數:4549


1976 年,一個瑞士計算機科學家寫一本書 《Algorithms + Data Structures = Programs》。即:算法 + 數據(ju)結構 = 程序。40 多年過去了,這(zhe)個(ge)等式依然成(cheng)立。

很多代碼面試題都要求候選者深入理解數據結構,不管你來自大學計算機專業還是(shi)編(bian)程培訓機構(gou),也不管(guan)你有多(duo)少年編(bian)程經驗。有時面試題會直接(jie)提到數據結構(gou),比(bi)如“給我實現一(yi)個(ge)二叉樹”,然而有時則不那么明顯(xian),比(bi)如“統計一(yi)下每個(ge)作(zuo)者寫的(de)書的(de)數量”。

什么是數據(ju)結構?

數據結構是計算機存(cun)儲、組(zu)織數(shu)據的(de)(de)方(fang)式。對于特定(ding)的(de)(de)數(shu)據結(jie)構(gou)(比如數(shu)組(zu)),有些操(cao)作效率(lv)很高(讀某個數(shu)組(zu)元(yuan)素),有些操(cao)作的(de)(de)效率(lv)很低(刪除某個數(shu)組(zu)元(yuan)素)。程序員(yuan)的(de)(de)目(mu)標(biao)是為當前的(de)(de)問題選擇最優的(de)(de)數(shu)據結(jie)構(gou)。

為什么(me)我們需要數(shu)據結(jie)構?

數(shu)(shu)據是程序的(de)核心要素,因此(ci)數(shu)(shu)據結構的(de)價值不(bu)言(yan)而喻(yu)。無論你在(zai)寫(xie)什么(me)程序,你都需(xu)要與(yu)數(shu)(shu)據打(da)交(jiao)道,比如員工工資、股票價格、雜貨清單或者(zhe)電(dian)話本(ben)。在(zai)不(bu)同場景(jing)下,數(shu)(shu)據需(xu)要以特(te)定(ding)的(de)方(fang)式存儲(chu),我們有不(bu)同的(de)數(shu)(shu)據結構可以滿足(zu)我們的(de)需(xu)求。

8 種常用數據結構

  1. 數組
  2. 隊列
  3. 鏈表
  4. 前綴樹
  5. 哈希表

1. 數組

數組(zu)(zu)(Array)大(da)概是最簡(jian)單(dan),也是最常用的(de)數據結構(gou)了。其他數據結構(gou),比如棧和隊列都(dou)是由數組(zu)(zu)衍生出來的(de)。

下圖(tu)展示了 1 個數組,它有 4 個元(yuan)素:

每一(yi)個(ge)數組元素(su)的(de)位置由數字編號,稱(cheng)為下標(biao)或者索引(index)。大(da)多數編程語言的(de)數組第一(yi)個(ge)元素(su)的(de)下標(biao)是 0。

根(gen)據維度(du)區分,有 2 種不同的數組:

  • 一維數組(如上圖所示)
  • 多維數組(數組的元素為數組)

數組(zu)的基本操作

  • Insert - 在某個索引處插入元素
  • Get - 讀取某個索引處的元素
  • Delete - 刪除某個索引處的元素
  • Size - 獲取數組的長度

2. 棧

撤回(hui),即 Ctrl+Z,是我們最(zui)常見的(de)(de)操作之一,大多數(shu)應(ying)用(yong)都會支持這(zhe)個(ge)功能。你知道它是怎么(me)實(shi)現的(de)(de)嗎?答案是這(zhe)樣的(de)(de):把(ba)之前的(de)(de)應(ying)用(yong)狀(zhuang)態(限(xian)制個(ge)數(shu))保存到內存中,最(zui)近的(de)(de)狀(zhuang)態放到第(di)一個(ge)。這(zhe)時,我們需(xu)要(yao)棧(stack)來實(shi)現這(zhe)個(ge)功能。

棧中的元素采用 LIFO (Last In First Out),即后進(jin)先出(chu)。

下(xia)圖的棧有 3 個元(yuan)素,3 在最上面(mian),因此它會被第一個移除:

棧的(de)基本操作

  • Push — 在棧的最上方插入元素
  • Pop — 返回棧最上方的元素,并將其刪除
  • isEmpty — 查詢棧是否為空
  • Top — 返回棧最上方的元素,并不刪除

3. 隊(dui)列

隊(dui)(dui)列(lie)(Queue)與棧類似(si),都是采用(yong)(yong)線性(xing)結構存(cun)儲(chu)數據。它們的區別在于,棧采用(yong)(yong) LIFO 方式,而隊(dui)(dui)列(lie)采用(yong)(yong)先進(jin)先出(chu),即FIFO(First in First Out)。

下圖展(zhan)示了(le)一個隊(dui)列(lie),1 是最上面的元素,它會被第一個移除:

隊列的基本操(cao)作

  • Enqueue — 在隊列末尾插入元素
  • Dequeue — 將隊列第一個元素刪除
  • isEmpty — 查詢隊列是否為空
  • Top — 返回隊列的第一個元素

4. 鏈表(biao)

鏈表(Linked List)也是線性結構,它與數(shu)組看起來非(fei)常(chang)像,但是它們的內(nei)存分配方式、內(nei)部結構和(he)插入刪除(chu)操作方式都不一樣。

鏈(lian)表是一系列節(jie)點(dian)組成的(de)鏈(lian),每一個(ge)節(jie)點(dian)保(bao)存了數據以及指(zhi)(zhi)向下一個(ge)節(jie)點(dian)的(de)指(zhi)(zhi)針(zhen)。鏈(lian)表頭指(zhi)(zhi)針(zhen)指(zhi)(zhi)向第一個(ge)節(jie)點(dian),如果鏈(lian)表為(wei)空,則頭指(zhi)(zhi)針(zhen)為(wei)空或者為(wei) null。

鏈表可以(yi)用來(lai)實現文件系統、哈希表和鄰接表。

下圖展示(shi)了一個鏈表,它有 3 個節點:

鏈表分為 2 種:

  • 單向鏈表
  • 雙向鏈表

鏈表的基本(ben)操(cao)作

  • InsertAtEnd — 在鏈表結尾插入元素
  • InsertAtHead — 在鏈表開頭插入元素
  • Delete — 刪除鏈表的指定元素
  • DeleteAtHead — 刪除鏈表第一個元素
  • Search — 在鏈表中查詢指定元素
  • isEmpty — 查詢鏈表是否為空

5. 圖

圖(tu)(graph)由多個(ge)節點(vertex)構成(cheng)(cheng),節點之間闊以互(hu)相(xiang)連(lian)接組(zu)成(cheng)(cheng)一個(ge)網(wang)絡(luo)。(x, y)表(biao)示一條邊(edge),它表(biao)示節點 x 與 y 相(xiang)連(lian)。邊可能會有權值(weight/cost)。

圖分為兩種:

  • 無向圖
  • 有向圖

在編程語言中,圖(tu)有(you)可(ke)能有(you)以(yi)下兩種形式表示:

  • 鄰接矩陣(Adjacency Matrix)
  • 鄰接表(Adjacency List)

遍歷圖有兩周算法

  • 廣度優先搜索(Breadth First Search)
  • 深度優先搜索(Depth First Search)

6. 樹

樹(Tree)是(shi)一個分層的(de)(de)數據(ju)結構,由節(jie)(jie)點和連接節(jie)(jie)點的(de)(de)邊組成。樹是(shi)一種特(te)殊的(de)(de)圖(tu),它與圖(tu)最大的(de)(de)區別(bie)是(shi)沒有循環。

樹被廣泛應用在人工智(zhi)能(neng)和(he)一些復(fu)雜算法(fa)中,用來提供高效的(de)存儲結構。

下圖是一個簡(jian)單的樹以及與樹相關的術語:

樹有很多分類:

  • N 叉樹(N-ary Tree)
  • 平衡樹(Balanced Tree)
  • 二叉樹(Binary Tree)
  • 二叉查找樹(Binary Search Tree)
  • 平衡二叉樹(AVL Tree)
  • 紅黑樹(Red Black Tree)
  • 2-3 樹(2–3 Tree)

其中,二(er)(er)叉(cha)樹(shu)和二(er)(er)叉(cha)查找(zhao)樹(shu)是最常用的樹(shu)。

7. 前綴樹

前綴樹(Prefix Trees 或者 Trie)與樹類似,用于處理字(zi)符串相關的問題(ti)時非常高效。它(ta)可以實現快速檢索,常用于字(zi)典中的單(dan)詞查詢,搜索引(yin)擎的自動補全甚至(zhi) IP 路由(you)。

下圖展示了“top”, “thus”和“their”三個單詞(ci)在(zai)前(qian)綴樹中如何(he)存儲的:

單詞是按照字母從(cong)上往下(xia)存儲(chu),“p”, “s”和“r”節點(dian)分別表(biao)示“top”, “thus”和“their”的單詞結尾。

8. 哈希表

哈希(Hash)將某(mou)個(ge)對(dui)象變換為唯(wei)一(yi)標識(shi)符,該標識(shi)符通常(chang)用(yong)一(yi)個(ge)短的隨機字(zi)母(mu)和數字(zi)組(zu)成的字(zi)符串來代表。哈希可以用(yong)來實現各種數據結構,其中(zhong)最常(chang)用(yong)的就是哈希表(hash table)。

哈希表通常(chang)由數組(zu)實現。

哈(ha)希表的性能取(qu)決(jue)于 3 個指標:

  • 哈希函數
  • 哈希表的大小
  • 哈希沖突處理方式

下(xia)圖展示了有數組實現的哈(ha)希(xi)(xi)表(biao)(biao),數組的下(xia)標即(ji)為(wei)哈(ha)希(xi)(xi)值,由哈(ha)希(xi)(xi)函數計算,作為(wei)哈(ha)希(xi)(xi)表(biao)(biao)的鍵(key),而數組中保存的數據即(ji)為(wei)值(value):

在線客服
客服電話
  • 0755-23712116
  • 13310869691