1. 程式人生 > >常用的資料結構和演算法

常用的資料結構和演算法

>  資料結構:線性表,堆疊,佇列,串,陣列,樹和二叉樹(紅黑樹是平衡二叉樹嗎?)

> 演算法
- 演算法:遞迴演算法,二分查詢演算法

- 排序演算法
簡單排序:氣泡排序、選擇排序、插入排序
高階排序:快速排序、歸併排序、希爾排序
相關演算法知識:劃分、遞迴、二分查詢

1.插入排序:直接插入排序,希爾排序
2.選擇排序:直接選擇排序,堆排序
3.交換排序:氣泡排序,快速排序
4.歸併排序
5.基數排序

https://github.com/desaco1989/DesignPattern_Algorithm_EncryptDecrypt/tree/master/src/com/desaco/Algorithm/CommonlyUsedAlgorithm

-- 演算法的時間複雜度和控制元件複雜度

https://img-blog.csdnimg.cn/20181109184332493.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYXJlVXM=,size_16,color_FFFFFF,t_70

> 二叉樹
- 滿二叉樹和完全二叉樹的區別:
 完全二叉樹:設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,
第 h 層所有的結點都連續集中在最左邊;
 滿二叉樹:深度為k且有2^k-1個結點的二叉樹稱為滿二叉樹。
 在滿叉樹的基礎上,我在最底層從右往左刪去若干節點,得到的都是完全二叉樹。

https://img-blog.csdnimg.cn/20181109111648824.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoYXJlVXM=,size_16,color_FFFFFF,t_70

- 平衡二叉樹
 平衡二叉樹:樹的左右子樹的高度差不超過1的數,空樹也是平衡二叉樹的一種。
 平衡二叉樹,又稱AVL樹。它或者是一棵空樹,或者是具有下列性質的二叉樹:它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的高度之差之差的絕對值不超過1.。
 常用演算法有:紅黑樹、AVL樹、Treap等。

 平衡二叉樹的調整方法:平衡二叉樹是在構造二叉排序樹的過程中,每當插入一個新結點時,首先檢查是否因插入新結點而破壞了二叉排序樹的平衡性,若是,則找出其中的最小不平衡子樹,在保持二叉排序樹特性的前提下,調整最小不平衡子樹中各結點之間的連結關係,進行相應的旋轉,使之成為新的平衡子樹。

 哈夫曼樹:帶權路徑長度達到最小的二叉樹,也叫做最優二叉樹。
 不關心樹的結構,只要求帶權值的路徑達到最小值,哈夫曼樹可能是完全二叉樹也可能是滿二叉樹。
https://img-blog.csdnimg.cn/20181109111715542.png

  平衡二叉樹,平衡二叉搜尋樹(Self-balancing binary search tree)又被稱為AVL樹(有別於AVL演算法),且具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的常用實現方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹等。 最小二叉平衡樹的節點總數的公式如下 F(n)=F(n-1)+F(n-2)+1 這個類似於一個遞迴的數列,可以參考Fibonacci(斐波那契)數列,1是根節點,F(n-1)是左子樹的節點數量,F(n-2)是右子樹的節點數量。

  紅黑樹是一種自平衡二叉查詢樹,是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。它是在1972年由Rudolf Bayer發明的,他稱之為"對稱二叉B樹",它現代的名字是在 Leo J. Guibas 和 Robert Sedgewick 於1978年寫的一篇論文中獲得的。它是複雜的,但它的操作有著良好的最壞情況執行時間,並且在實踐中是高效的: 它可以在O(log n)時間內做查詢,插入和刪除,這裡的n是樹中元素的數目。
  AVL是最先發明的自平衡二叉查詢樹演算法。在AVL中任何節點的兩個兒子子樹的高度最大差別為一,所以它也被稱為高度平衡樹,n個結點的AVL樹最大深度約1.44log2n。查詢、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。
  Treap是一棵二叉排序樹,它的左子樹和右子樹分別是一個Treap,和一般的二叉排序樹不同的是,Treap紀錄一個額外的資料,就是優先順序。Treap在以關鍵碼構成二叉排序樹的同時,還滿足堆的性質(在這裡我們假設節點的優先順序大於該節點的孩子的優先順序)。但是這裡要注意的是Treap和二叉堆有一點不同,就是二叉堆必須是完全二叉樹,而Treap並不一定是。
  伸展樹(Splay Tree)是一種二叉排序樹,它能在O(log n)內完成插入、查詢和刪除操作。它由Daniel Sleator和Robert Tarjan創造。它的優勢在於不需要記錄用於平衡樹的冗餘資訊。在伸展樹上的一般操作都基於伸展操作。
  SBT,Size Balanced Tree(簡稱SBT)是一自平衡二叉查詢樹,是在電腦科學中用到的一種資料結構。它是由中國廣東中山紀念中學的陳啟峰發明的。陳啟峰於2006年底完成論文《Size Balanced Tree》,並在2007年的全國青少年資訊學奧林匹克競賽冬令營中發表。由於SBT的拼寫很容易找到中文諧音,它常被中國的資訊學競賽選手和ACM/ICPC選手們戲稱為“傻B樹”、“Super BT”等。相比紅黑樹、AVL樹等自平衡二叉查詢樹,SBT更易於實現。據陳啟峰在論文中稱,SBT是“目前為止速度最快的高階二叉搜尋樹”。SBT能在O(log n)的時間內完成所有二叉搜尋樹(BST)的相關操作,而與普通二叉搜尋樹相比,SBT僅僅加入了簡潔的核心操作Maintain。由於SBT賴以保持平衡的是size域而不是其他“無用”的域,它可以很方便地實現動態順序統計中的select和rank操作。

> 紅黑樹
 紅黑樹(Red Black Tree) 是一種自平衡二叉查詢樹,是在電腦科學中用到的一種資料結構,典型的用途是實現
關聯陣列。
平衡二叉樹是大堆或小堆嗎?平衡二叉樹/紅黑樹就是為了將查詢的時間複雜度保證在O(logN)範圍內。

紅黑樹與平衡二叉樹:
  平衡二叉樹AVL樹適合用於插入與刪除次數比較少,但查詢多的情況。由於維護這種高度平衡所付出的代價比從中獲
得的效率收益還大,故而實際的應用不多,更多的地方是用追求區域性而不是非常嚴格整體平衡的紅黑樹。當然,如果
應用場景中對插入刪除不頻繁,只是對查詢要求較高,那麼AVL還是較優於紅黑樹。

  紅黑樹:一種二叉查詢樹,但在每個節點增加一個儲存位表示節點的顏色,可以是紅或黑(非紅即黑)。通過對任
何一條從根到葉子的路徑上各個節點著色的方式的限制,紅黑樹確保沒有一條路徑會比其它路徑長出兩倍,因此,紅
黑樹是一種弱平衡二叉樹(由於是弱平衡,可以看到,在相同的節點情況下,AVL樹的高度低於紅黑樹),相對於要求
嚴格的AVL樹來說,它的旋轉次數少,所以對於搜尋,插入,刪除操作較多的情況下,我們就用紅黑樹。
 
- 紅黑樹應用:
 1,廣泛用於C ++的STL中,地圖和集都是用紅黑樹實現的; 
 2,著名的Linux的的程序排程完全公平排程程式,用紅黑樹管理程序控制塊,程序的虛擬記憶體區域都儲存在一顆紅黑
樹上,每個虛擬地址區域都對應紅黑樹的一個節點,左指標指向相鄰的地址虛擬儲存區域,右指標指向相鄰的高地址
虛擬地址空間; 
 3,IO多路複用的epoll的的的實現採用紅黑樹組織管理的的的sockfd,以支援快速的增刪改查; 
 4,Nginx的的的中用紅黑樹管理定時器,因為紅黑樹是有序的,可以很快的得到距離當前最小的定時器; 
 5,Java的的的中TreeMap中的中的實現;

- 紅黑樹性質:
性質1. 節點是紅色或黑色。
性質2. 根節點是黑色。
性質3 每個葉節點(NIL節點,空節點)是黑色的。
性質4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
性質5. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。
https://img-blog.csdnimg.cn/20181109182805156.png