1.平衡二叉樹和紅黑樹
- 【平衡二叉樹】:又稱爲AVL樹,是一種特殊的二叉排序樹,它的左右子樹都是平衡二叉樹,且左右子樹高度差的絕對值不大於1。將二叉樹上結點的左子樹深度減去右子樹深度稱爲平衡因子BF,平衡二叉樹上的平衡因子只可能是-1、0、1,否則二叉樹就不是平衡的。
- 【紅黑樹】:是一種二叉查找樹,但每個結點增加一個存儲位表示結點顏色(非黑即紅),通過對任何一條從根到葉子結點的路徑各個結點着色方式的限制,紅黑樹確保沒有一條路徑是其他路徑長度的兩倍,因此,紅黑樹是一種弱平衡二叉樹,相比於AVL樹,它的旋轉次數少,對於搜索、插入、刪除操作較多的情況下,通常選紅黑樹。
- 【區別】
- AVL樹是高度平衡的,頻繁插入和刪除,效率下降
- 紅黑樹不是高度平衡的,插入最多旋轉2次,刪除最多旋轉3次
2.哈夫曼編碼
哈夫曼編碼是哈夫曼樹的一種應用,廣泛用於數據文件壓縮。
3.B+樹
B+樹是一種多路搜索樹,主要爲磁盤或其他直接存取輔助設備而設計的一種平衡二叉樹,在B+樹中,按照關鍵字大小有序排列。所有記錄節點都是按照鍵值大小順序存放在同一層的葉節點中。
相比於B樹,B+樹有以下特點:
- 每個節點上的指針上限爲
2d
而不是2d+1
(d爲節點的出度) - 內節點不存儲data,只存儲key
- 葉子結點不存儲指針
4.排序算法
(1)冒泡排序
重複走訪過要排序的數列,一次比較相鄰的兩個元素,如果他們順序錯誤就交換,直到沒有再需要交換。
兩個for循環,第一個循環0~len-1,第二個循環0~len-1-i
(2)選擇排序
首先在未排序的序列中找出最大(小)元素,存放在排序序列的起始位置,然後再從剩餘未排序的元素中繼續尋找最大(小)元素,放到排序序列的末尾,直到所有元素均排序完畢。
(3)插入排序
通過構建有序序列,對未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入
(4)希爾排序
插入排序的升級版
- 根據某一增量將序列分爲若干個子序列,並對子序列進行插入排序
- 然後逐漸將增量縮小,並重覆上述過程,直到增量爲1,此時數據基本有序,最後進行插入排序
(5)快速排序
- 基本思想:分治思想
先從數列中取出一個數作爲key值,將比這個數小的數全部放在它的左邊,大於或等於它的數全部放在它的右邊,對左右兩個小數列重複第二步,直至區間只有1個數。
(6)歸併排序
採用分治法,對於包含m個元素的待排序序列,將其看成m個長度爲1的子序列。然後兩兩進行歸併,得到m/2個長度爲2或者1的有序子序列;然後再兩兩歸併,直到得到1個長度爲m的有序序列
(7)堆排序
堆排序是一種選擇排序,利用堆這種數據結構來完成。其算法思想是將待排序的數據構造成一個最大堆(升序)或最小堆(降序),然後將堆頂元素與待排序數組的最後一個元素交換位置,此時末尾元素就是最大或最小的值。然後將剩餘n-1個元素重新構造成最大堆或最小堆。
(8)基數排序
一般用於長度相同的元素(不相同補0)組成的數組,首先按照最低有效數字排序,再由低到高位排序
(9)計數排序
對數組中的每一個元素x,確定出小於x的元素個數,這樣就可以將x輸出到正確位置了
(10)桶排序
將待排序元素劃分到不同的痛。先掃描一遍序列求出最大值 maxV 和最小值 minV,設桶的個數爲 k ,則把區間 [minV, maxV] 均勻劃分成 k 個區間,每個區間就是一個桶。將序列中的元素分配到各自的桶。對每個桶內的元素進行排序。可以選擇任意一種排序算法。將各個桶中的元素合併成一個大的有序序列。
5.查找算法
(1)順序查找
順序查找適合於存儲結構爲順序結構或者鏈接結構的線性表,順序查找也稱爲線性查找,屬於無序查找,從線性表的一端開始查找,查找到最後。
(2)二分查找
元素必須是有序的,如果是無序的要先進行排序操作。
也稱折半查找。用給給定值與中間結點的關鍵字比較,中間結點把線性表分成兩個子表,若相等則查找成功,若不等,再根據關鍵字確定下一步查找哪個子表,這樣遞歸進行下去。
(3)插值查找
基於二分查找,是自適應的,根據關鍵字在整個有序表中所處的位置,讓中間值更加靠近關鍵字,間接減少比較次數
5.貪心算法
基本思路是從問題的某一個初始解出發一步一步的進行,根據某個優化測度,每一步都要確保能獲得局部最優解。
6.輾轉相除法
求兩個數m、n的最小公倍數和最大公約數,以除數和餘數反覆做除法運算,當餘數爲 0 時,取當前算式除數爲最大公約數 最小公倍數=兩數之積/最大公約數
7.如何判斷素數
判斷m是不是素數,讓m被2~(根號m)之間的數除,如果不能被之間的任何一個數整除,那麼m就是素數!