數據結構總結--更新中

數據結構:


  1. 線性表
    • 順序表
    • 鏈表
  2. 棧和隊列
    • 優先級隊列
    • 雙端隊列
  3. 集合
    • 散列表
    • 跳錶(Redis利用跳錶實現有序集合Sorted Set)
    • 二叉樹
    • 線索二叉樹
    • 樹與森林
    • 樹與森林的遍歷
    • Huffman樹
    • 圖的遍歷
      • 深度優先
      • 廣度優先
    • 最小生成樹
      • Kruskal算法
      • Prim算法
    • 最短路徑
  4. 搜索結構
    • 二分查找
    • 二叉搜索樹
    • 平衡二叉樹(AVL樹)
    • 紅黑樹
  5. 索引結構
    • B樹
    • B+樹

數據結構

1、AarryList、LinkedList、Stack、Queue常用方法

####1.1 AarryList用法

ava.util.ArrayList < E > 的一些方法 描述
+add(o: E): void 在list的末尾添加一個元素o
+add(index: int, o: E): void 在指定的index處插入元素o
+set(index: int, o: E): E 設置指定index處的元素爲o
+get(index: int): E 返回指定index處的元素
+clear(): void 從list中刪除所有元素
+remove(o: Object): boolean 刪除list中的第一個元素o,如果元素被刪除,返回true
+remove(index: int): boolean 刪除指定index處的元素,如果元素被刪除,返回true
+size(): int 返回list中元素個數
+isEmpty(): boolean 如果list不含元素,返回true
+contains(o: Object): boolean 如果list含有元素o,返回true
+indexOf(o: Object): int 返回list中第一個匹配元素的index
+lastIndexOf(o: Object): int 返回list中最後一個匹配元素的index

1.2 LinkedList用法

增加
add(E e):在鏈表後添加一個元素; 通用方法
addFirst(E e):在鏈表頭部插入一個元素; 特有方法
addLast(E e):在鏈表尾部添加一個元素; 特有方法
push(E e):與addFirst方法一致
offer(E e):在鏈表尾部插入一個元素 add(int index, E element):在指定位置插入一個元素。
offerFirst(E e):JDK1.6版本之後,在頭部添加; 特有方法 offerLast(E e):JDK1.6版本之後,在尾部添加; 特有方法
刪除
remove() :移除鏈表中第一個元素; 通用方法
remove(E e):移除指定元素; 通用方法
removeFirst(E e):刪除頭,獲取元素並刪除; 特有方法
removeLast(E e):刪除尾; 特有方法
pollFirst():刪除頭; 特有方法
pollLast():刪除尾; 特有方法
pop():和removeFirst方法一致,刪除頭。
poll():查詢並移除第一個元素 特有方法

get(int index):按照下標獲取元素; 通用方法
getFirst():獲取第一個元素; 特有方法
getLast():獲取最後一個元素; 特有方法
peek():獲取第一個元素,但是不移除; 特有方法
peekFirst():獲取第一個元素,但是不移除;
peekLast():獲取最後一個元素,但是不移除;
pollFirst():查詢並刪除頭; 特有方法
pollLast():刪除尾; 特有方法
poll():查詢並移除第一個元素 特有方法
其他:
boolean contains(Object o)
size()
void clear()
int indexOf(Object o)
int lastIndexOf(Object o)

1.3 Stack用法

Stack的一些方法 描述
push( num) 入棧
pop() 棧頂元素出棧
empty() 判定棧是否爲空
peek() 獲取棧頂元素
search(num) 判端元素num是否在棧中,如果在返回1,不在返回-1。

1.4 Queue用法

方法名 描述 解釋說明
add 增加一個元索 如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常
remove 移除並返回隊列頭部的元素 如果隊列爲空,則拋出一個NoSuchElementException異常
element 返回隊列頭部的元素 如果隊列爲空,則拋出一個NoSuchElementException異常
offer 添加一個元素並返回true 如果隊列已滿,則返回false
poll 移除並返問隊列頭部的元素 如果隊列爲空,則返回null
peek 返回隊列頭部的元素 如果隊列爲空,則返回null
put 添加一個元素 如果隊列滿,則阻塞
take 移除並返回隊列頭部的元素 如果隊列爲空,則阻塞

2、集合

2.1 散列表

  1. 散列方法
    • 除留餘數法
    • 數字分析法
    • 平方取中法
    • 摺疊法
  2. 處理哈希衝突的方法
    • 開放定址法
      • 線性探測法
      • 二次探測法
      • 僞隨機數探測法
    • 再哈希法
    • 鏈地址法
    • 建立一個公共溢出區

2.2跳錶

跳躍表(skiplist)是一種有序數據結構,它通過在每個節點中維持多個指向其他節點的指針,從而達到快速訪問節點的目的。在大部分情況下,跳躍表的效率可以和平衡樹相媲美,並且因爲跳躍表的實現比平衡樹要來得更爲簡單,所以有不少程序都使用跳躍表來代替平衡樹。和鏈表、字典等數據結構被廣泛地應用在Redis內部不同,Redis只在兩個地方用到了跳躍表,一個是實現有序集合鍵,另一個是在集羣節點中用作內部數據結構,除此之外,跳躍表在Redis裏面沒有其他用途。

3、樹

3.1 線索二叉樹

用自己的話說就是:原來我們求一棵二叉樹的前序、中序、後序序列的時候,都必須用到遞歸遍歷相應的二叉樹,否則也得藉助棧等結構來記錄。這樣的話,如果我們想很快的找到某一個節點在某種序列下的前驅或後繼,每次都要遍歷,這顯然十分浪費時間。很自然,要是想避免這個重複工作,那麼我們就需要把所有節點的前驅和後繼記錄下來,這樣每次查找相應的記錄就行了。於是就引出了——‘線索’一詞。沒錯,真的是‘線索’,由線索找到相應節點的前驅和後繼,很形象!

3.2 線索二叉樹相關知識點

  • 線索二叉樹前中後序線索化
  • 線索二叉樹的遍歷
  • 線索二叉樹的插入和刪除

3.3 二叉樹

遞歸遍歷

 * 中序遍歷二叉樹(遞歸)
 */
public void PrintBinaryTreeMidRecur(TreeNode<T> root)
{
    if (root!=null) 
    {
        PrintBinaryTreeMidRecur(root.left);
        System.out.print(root.data);
        PrintBinaryTreeMidRecur(root.right);
    }
}

非遞歸遍歷

 * 中序遍歷二叉樹(非遞歸)
 * 
 * 思路:先將T入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應爲T,
 *       出棧,訪問T->data,再中序遍歷T的右子樹。  
 */
public void PrintBinaryTreeMidUnrecur(TreeNode<T> root)
{
    TreeNode<T> p=root;//p爲當前節點
    LinkedList<TreeNode> stack=new LinkedList<>();

    //棧不爲空時,或者p不爲空時循環
    while(p!=null || !stack.isEmpty())
    {
        //當前節點不爲空。壓入棧中。並將當前節點賦值爲左兒子
        if (p!=null) 
        {
            stack.push(p);
            p=p.left;
        }
        //當前節點爲空:
        //  1、當p指向的左兒子時,此時棧頂元素必然是它的父節點
        //  2、當p指向的右兒子時,此時棧頂元素必然是它的爺爺節點
        //取出並訪問棧頂元素,賦值爲right
        else
        {
            p=stack.pop();
            System.out.print(p.data);
            p=p.right;
        }
    }
}

層次遍歷

 * 層次遍歷二叉樹(非遞歸)   
 */
public void PrintBinaryTreeLayerUnrecur(TreeNode<T> root)
{
    LinkedList<TreeNode> queue=new LinkedList<>();
    TreeNode<T> p;
    queue.push(root);
    while(!queue.isEmpty())
    {
        p=queue.removeFirst();
        System.out.print(p.data);
        if (p.left!=null)
            queue.addLast(p.left);
        if (p.right!=null)
            queue.addLast(p.right);
    }
}

}

3.4 哈夫曼樹的應用

  • 最優判定樹
  • Huffman編碼

4、 圖

4.1圖的存儲

  • 鄰接表
  • 鄰接矩陣

4.2 圖的遍歷

  • 深度優先遍歷
  • 廣度優先遍歷

4.3 最小生成樹

  • Kruskal算法
  • Prime算法

4.4 最短路徑

  • Dijkstra算法

5、二叉搜索樹

  • AVL樹
  • 紅黑樹

都是爲提高搜索效率而建立的搜索結構

6、索引結構

B樹和B+樹都是平衡多路搜索樹

  • B樹
  • B+樹

B+tree:是應文件系統所需而產生的一種B-tree的變形樹。
一棵m階的B+樹和m階的B樹的異同點在於:

  1. 有n棵子樹的結點中含有n-1 個關鍵字; (此處頗有爭議,B+樹到底是與B 樹n棵子樹有n-1個關鍵字 保持一致,還是不一致:B樹n棵子樹的結點中含有n個關鍵字,待後續查證。暫先提供兩個參考鏈接:①wikipedia http://en.wikipedia.org/wiki/B%2B_tree#Overview;②http://hedengcheng.com/?p=525。而下面B+樹的圖尚未最終確定是否有問題,請讀者注意)
  2. 所有的葉子結點中包含了全部關鍵字的信息,及指向含有這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大的順序鏈接。 (而B 樹的葉子節點並沒有包括全部需要查找的信息)
  3. 所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。 (而B 樹的非終節點也包含需要查找的有效信息)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章