數據結構知識學習與面試

原文鏈接:  https://github.com/Snailclimb/JavaGuide#java

版權原作者所有,此處個人記錄備用

1.Queue

什麼是隊列

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

隊列的種類

  • 單隊列(單隊列就是常見的隊列, 每次添加元素時,都是添加到隊尾,存在“假溢出”的問題也就是明明有位置卻不能添加的情況)
  • 循環隊列(避免了“假溢出”的問題)

Java 集合框架中的隊列 Queue

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

推薦文章

2.Set

什麼是 Set

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

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

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

  • 有序集合:集合裏的元素可以根據 key 或 index 訪問 (List、Map)
  • 無序集合:集合裏的元素只能遍歷。(Set)

HashSet 和 TreeSet 底層數據結構

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

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

             有序的實現:實現Comparable接口,並重寫compareTo方法; 實現Comparetor<t>接口,並重寫compare方法;

推薦文章

3.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 源碼學習

推薦閱讀

4.Map

5.樹

  • 1 二叉樹

    二叉樹(百度百科)

    (1)完全二叉樹——若設二叉樹的高度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹。

    (2)滿二叉樹——除了葉結點外每一個結點都有左右子葉且葉子結點都處在最底層的二叉樹。

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

  • 2 完全二叉樹

    完全二叉樹(百度百科)

    完全二叉樹:葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹。

  • 3 滿二叉樹

    滿二叉樹(百度百科,國內外的定義不同)

    國內教程定義:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數爲K,且結點總數是(2^k) -1 ,則它就是滿二叉樹。

  • 數據結構之堆的定義

    堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱爲大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱爲小頂堆。

  • 4 二叉查找樹(BST)

    淺談算法和數據結構: 七 二叉查找樹

    二叉查找樹的特點:

    1. 若任意節點的左子樹不空,則左子樹上所有結點的 值均小於它的根結點的值;
    2. 若任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
    3. 任意節點的左、右子樹也分別爲二叉查找樹;
    4. 沒有鍵值相等的節點(no duplicate nodes)。
  • 5 平衡二叉樹(Self-balancing binary search tree)

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

  • 6 紅黑樹

    • 紅黑樹特點:
    1. 每個節點非紅即黑;
    2. 根節點總是黑色的;
    3. 每個葉子節點都是黑色的空節點(NIL節點);
    4. 如果節點是紅色的,則它的子節點必須是黑色的(反之不一定);
    5. 從根節點到葉節點或空子節點的每條路徑,必須包含相同數目的黑色節點(即相同的黑色高度)。
  • 7 B-,B+,B*樹

    二叉樹學習筆記之B樹、B+樹、B*樹

    《B-樹,B+樹,B*樹詳解》

    《B-樹,B+樹與B*樹的優缺點比較》

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

  • 8 LSM 樹

    [HBase] LSM樹 VS B+樹

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

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

    LSM樹由來、設計思想以及應用到HBase的索引

BFS及DFS

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章