Java基礎 第三節 第十課
概述
當你用著 Java 裡面的容器類一把一把的掉頭髮的時候, 你有沒有想過, 怎麼 ArrayList 就像一個無限擴充的陣列, 也好像連結串列之類的. 這就是資料結構的用處, 只不過你在不知不覺中使用了.
現實世界的儲存, 我們使用的工具和建模. 每種資料結構有自己的優點和缺點, 想想如果蒼老師的資料是用陣列儲存, 我們還能方便的查詢到所需要的資料嗎? 而演算法, 在這麼多的資料中如何做到最快的插入, 查詢, 刪除, 也是在追求更快.
我們 Java 是物件導向的語言, 就好似自動檔轎車, C 語言好似手動擋吉普. 那麼資料結構就是變速箱的工作原理. 你可以完全不知道變速箱怎麼工作, 就把自動擋的車子從 A 點開到 B 點, 而未必就比懂的人慢. 寫程式這件事和開車一樣, 經驗可以起到很大的作用. 如果你不知道底層是怎麼工作的, 就永遠只能開車而不會修車, 也不能造車. 當然了, 資料結構的內容不叫多, 系統的學習也是相對費功夫的. 我們常見的資料結構: 堆疊, 佇列, 陣列, 連結串列和紅黑樹. 今天我來給大家介紹一下, 作為資料結構的入門, 瞭解一下它們的特點即可. ( 詳細的資料結構教程可以參閱我寫的 <Python 資料結構>)
常見的資料結構
資料儲存的常用結構有: 棧, 佇列, 陣列, 連結串列和紅黑樹. 我們分別來了解一下:
棧
棧 (stack): 又稱堆疊, 它是運算受限的線性代表. 其限制是僅允許在表的一端進行插入和刪除操作, 不允許在其他任何位置進行新增, 查詢, 刪除等操作.
採用該結構的集合, 對元素的存取有如下的特點:
- 先進後出 (即, 存進去的元素, 要在它後面的元素依次取出後, 才能取出該元素) 例如, 子彈壓進彈夾, 先壓進去的子彈在下面, 後壓進去的子彈在上面. 當開槍時, 先彈出上面的子彈, 然後才能彈出下面的子彈
- 棧的入口, 出口都是棧的頂端位置
這裡兩個名詞需要注意:
- 壓棧: 就是儲存元素. 即把元素儲存到棧頂端位置. 棧中已有的元素依次向棧底方向移動一個位置
- 壓棧: 就是提取元素. 即把棧的頂端位置元素取出, 棧中已有的元素依次向棧頂方向移動一個位置
佇列
佇列 (quene): 簡稱隊, 它同棧一樣, 元素一種運算受限的線性表. 其限制是僅允許在表的一端進行插入, 而在表的另一端進行刪除.
採用該結構的集合, 對元素的存取有如下的特點:
- 先進先出 (即存進去的元素, 要在它前面的元素依次取出後, 才能取出該元素). 例如, 小火車過山進洞, 車頭先進去, 車尾後進去; 車頭先處理, 車尾後出來.
- 佇列的入口, 出口各在一側. 例如, 下圖的左側為入口, 右側為出口.
陣列
陣列 (Array): 是有序的元素序列, 陣列是在記憶體中開闢一段連續的空間, 並在此空間存放元素. 就像是一排出租屋, 有 100 個房間, 從 001 到 100 每個房間都有固定的編號, 通過便後就可以快速找到租房子的人.
採用這種資料結構的集合, 對元素的存取有如下的特點:
- 查詢元素快: 通過索引, 可以快速訪問指定位置的元素
- 指定索引位置增加元素: 需要建立一個新陣列, 將指定新元素儲存在指定索引位置, 再把原陣列元素根據索引, 複製到新陣列所對應索引的位置. 如下圖:
- 指定位置刪除元素: 需要建立一個新陣列, 把原陣列元素根據索引, 複製到新陣列對應索引的位置, 元素中指定索引位置元素不復制到新陣列中. 如下圖:
連結串列
連結串列 (linked list): 由一系列節點 (node: 連結串列中每一個元素稱為節點) 組成, 節點可以在執行時動態生成. 每個節點包括兩個部分: 一個是儲存資料元素的資料域, 另一個是儲存下一個節點地址的指標域. 我們常說的連結串列結構有單向連結串列與雙向連結串列, 那麼這裡給大家介紹的是單向連結串列.
採用該結構的集合, 對元素的存取有如下的特點:
- 多個節點之間, 通過地址進行連線. 例如, 多個人手拉手, 每個人使用自己的右手拉住下個人的左手, 以此類推, 這樣多個人就連在一起了.
- 查詢元素慢: 想要查詢某個元素, 需要通過連線的節點, 依次向後查詢指定元素
- 增加元素快: 只需要修改連線下個元素的地址即可
- 刪除元素快: 只需要修改連線下個元素的地址即可
紅黑樹
二叉樹 (binary tree): 是每個節點不超過 2 的有序樹. (tree)
簡單的理解, 就是一種類似於我們生活中樹的結構, 只不過每個節點上都最多能有兩個子節點.
二叉樹是每個節點最多有兩個子樹的結構. 頂上的叫根節點, 兩邊被稱作 “左子樹” 和 “右子樹”. 如圖:
我們要說的二叉樹的一種比較有意思的叫做紅黑樹. 紅黑樹本身就是一顆二叉樹, 將節點插入後, 該樹任然是一顆二叉樹. 這就意味著, 樹的減值任然是有序的.
紅黑樹的約束:
- 節點可以是紅色或者黑色的
- 根節點是黑色的
- 葉子節點 (特指空節點) 是黑色的
- 每個紅色節點的子節點都是黑色的
- 任何一個節點到其每一個葉子節點的所有路徑上黑色節點數相同
紅黑樹的特點:
速度特別快, 趨近於平衡樹, 查詢葉子元素最少和最多次數不多於二倍.
相關文章
- Java基礎 第二節 第十課Java
- Java基礎 第二節 第三課Java
- Java基礎 第三節 第五課Java
- Java基礎 第三節 第七課Java
- Java基礎 第三節 第六課Java
- Java基礎 第三節 第一課Java
- Java基礎 第三節 第二十課Java
- Java基礎 第一節 第八課Java
- Python 第十節 第十七課Python
- java EE開發之Servlet第十一課:反射基礎三JavaServlet反射
- Java基礎 第二節 第二十一課Java
- Python 第十節 第六課Python
- android基礎學習-java篇day7-step3-第三節:java字串AndroidJava字串
- java基礎第二季最後一節課練習Java
- 老王的JAVA基礎課:第5課 物件導向Java物件
- Java基礎程式碼季節判斷季節1Java
- Python基礎(二十):物件導向“類”第三課——類成員Python物件
- 初等數學O 集合論基礎 第三節 序關係
- 開課吧Java課堂:小應用程式基礎是什麼Java
- 【零基礎網頁開發】 第十六課 form表單常用元素網頁ORM
- HarmonyOS 第一課:基礎課程
- 機器學習進階 第一節 第十六課機器學習
- Java基礎回顧(牛客網專案課程)Java
- JAVA開發面試題&基礎篇&第十部分(基礎篇結尾)Java面試題
- 第一章-JAVA基礎-課後總結和課後習題Java
- java基礎一些演算法(第三篇)Java演算法
- Java語言程式設計(基礎篇)第十版 5.14Java程式設計
- 圖觀™應用編輯器 零基礎入門課(第三講)
- 第65節:Java後端的學習之Spring基礎Java後端Spring
- 零基礎學Java第四節(字串相關類)Java字串
- 零基礎學Java第六節(物件導向二)Java物件
- Java基礎鞏固第三天(泛型、ArrayList、LinkList、HashSet)Java泛型
- Java基礎-語法基礎Java
- JAVA入門第三季第一章第九節課後練習題!Java
- 【UI】第三週 手繪基礎-CSDN就業班-專題視訊課程UI就業
- JAVA 基礎Java
- java基礎Java
- [Java基礎]Java