數據結構

數據結構
java

  • Queuenode

    • 什麼是隊列算法

    • 隊列的種類數據庫

    • Java 集合框架中的隊列 Queue編程

  • Set數組

    • 什麼是 Set安全

    • 補充:有序集合與無序集合說明微信

    • HashSet 和 TreeSet 底層數據結構數據結構

  • List併發

    • 什麼是List

    • List的常見實現類

    • ArrayList 和 LinkedList 源碼學習

  • Map


Queue

什麼是隊列

隊列是數據結構中比較重要的一種類型,它支持 FIFO,尾部添加、頭部刪除(先進隊列的元素先出隊列),跟咱們生活中的排隊相似。

隊列的種類

  • 單隊列(單隊列就是常見的隊列, 每次添加元素時,都是添加到隊尾,存在「假溢出」的問題也就是明明有位置卻不能添加的狀況)

  • 循環隊列(避免了「假溢出」的問題)

Java 集合框架中的隊列 Queue

Java 集合中的 Queue 繼承自 Collection 接口 ,Deque, LinkedList, PriorityQueue, BlockingQueue 等類都實現了它。Queue 用來存放 等待處理元素 的集合,這種場景通常用於緩衝、併發訪問。除了繼承 Collection 接口的一些方法,Queue 還添加了額外的 添加、刪除、查詢操做。

Set

什麼是 Set

Set 繼承於 Collection 接口,是一個不容許出現重複元素,而且無序的集合,主要 HashSetTreeSet 兩大實現類。

在判斷重複元素的時候,Set 集合會調用 hashCode()和 equal()方法來實現。

補充:有序集合與無序集合說明

  • 有序集合:集合裏的元素能夠根據 key 或 index 訪問 (List、Map)

  • 無序集合:集合裏的元素只能遍歷。(Set)

HashSet 和 TreeSet 底層數據結構

HashSet 是哈希表結構,主要利用 HashMap 的 key 來存儲元素,計算插入元素的 hashCode 來獲取元素在集合中的位置;

TreeSet 是紅黑樹結構,每個元素都是樹中的一個節點,插入的元素都會進行排序;

List

什麼是List

在 List 中,用戶能夠精確控制列表中每一個元素的插入位置,另外用戶能夠經過整數索引(列表中的位置)訪問元素,並搜索列表中的元素。與 Set 不一樣,List 一般容許重複的元素。另外 List 是有序集合而 Set 是無序集合。

List的常見實現類

ArrayList 是一個數組隊列,至關於動態數組。它由數組實現,隨機訪問效率高,隨機插入、隨機刪除效率低。

LinkedList 是一個雙向鏈表。它也能夠被看成堆棧、隊列或雙端隊列進行操做。LinkedList隨機訪問效率低,但隨機插入、隨機刪除效率高。

Vector 是矢量隊列,和ArrayList同樣,它也是一個動態數組,由數組實現。可是ArrayList是非線程安全的,而Vector是線程安全的。

Stack 是棧,它繼承於Vector。它的特性是:先進後出(FILO, First In Last Out)。相關閱讀:java數據結構與算法之棧(Stack)設計與實現

ArrayList 和 LinkedList 源碼學習

  • ArrayList 源碼學習

  • LinkedList 源碼學習

Map

  • 集合框架源碼學習之 HashMap(JDK1.8)

  • ConcurrentHashMap 實現原理及源碼分析


二叉樹——二叉樹是每一個結點最多有兩個子樹的樹結構。一般子樹被稱做「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。

徹底二叉樹——若設二叉樹的高度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,而且葉子結點都是從左到右依次排布,這就是徹底二叉樹;葉節點只能出如今最下層和次下層,而且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹

滿二叉樹——除了葉結點外每個結點都有左右子葉且葉子結點都處在最底層的二叉樹;一個二叉樹,若是每個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,若是一個二叉樹的層數爲K,且結點總數是(2^k) -1 ,則它就是滿二叉樹。

平衡二叉樹——平衡二叉樹又被稱爲AVL樹(區別於AVL算法),它是一棵二叉排序樹,且具備如下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,而且左右兩個子樹都是一棵平衡二叉樹。

數據結構之堆的定義:堆是具備如下性質的徹底二叉樹:每一個結點的值都大於或等於其左右孩子結點的值,稱爲大頂堆;或者每一個結點的值都小於或等於其左右孩子結點的值,稱爲小頂堆

二叉查找樹(BST)

二叉查找樹的特色:若任意節點的左子樹不空,則左子樹上全部結點的 值均小於它的根結點的值;若任意節點的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值;任意節點的左、右子樹也分別爲二叉查找樹。沒有鍵值相等的節點(no duplicate nodes)。

平衡二叉樹(Self-balancing binary search tree)

平衡二叉樹(平衡二叉樹的經常使用實現方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹等)

平衡二叉樹(Balanced Binary Tree)具備如下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,而且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的經常使用實現方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹等。最小二叉平衡樹的節點的公式以下 F(n)=F(n-1)+F(n-2)+1 這個相似於一個遞歸的數列,能夠參考Fibonacci數列,1是根節點,F(n-1)是左子樹的節點數量,F(n-2)是右子樹的節點數量。


紅黑樹


紅黑樹特色:每一個節點非紅即黑;根節點老是黑色的;每一個葉子節點都是黑色的空節點(NIL節點);若是節點是紅色的,則它的子節點必須是黑色的(反之不必定);從根節點到葉節點或空子節點的每條路徑,必須包含相同數目的黑色節點(即相同的黑色高度)

紅黑樹的應用:TreeMap、TreeSet以及JDK1.8以後的HashMap底層都用到了紅黑樹。

爲何要用紅黑樹?簡單來講紅黑樹就是爲了解決二叉查找樹的缺陷,由於二叉查找樹在某些狀況下會退化成一個線性結構。


B-,B+,B*樹


B-樹(或B樹)是一種平衡的多路查找(又稱排序)樹,在文件系統中有所應用。主要用做文件的索引。其中的B就表示平衡(Balance) 1. B+ 樹的葉子節點鏈表結構相比於 B- 樹便於掃庫,和範圍檢索。2. B+樹支持range-query(區間查詢)很是方便,而B樹不支持。這是數據庫選用B+樹的最主要緣由。3. B*樹 是B+樹的變體,B*樹分配新結點的機率比B+樹要低,空間使用率更高;


LSM 樹


B+樹最大的性能問題是會產生大量的隨機IO

爲了克服B+樹的弱點,HBase引入了LSM樹的概念,即Log-Structured Merge-Trees。








本文分享自微信公衆號 - 掌上編程(ThePalmJava)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索