第六章:變治法
三種類型:
(1)變換爲同樣問題的一個更簡單或者更方便的實例——實例簡化
(2)變換爲同樣實例的不同表現——改變表現
(3)變換爲另一個問題的實例,這種問題的算法是已知的——問題簡化
6.1預排序:
就是利用合併排序/快速排序,時間複雜度爲nlogN的先對要進行計算的數組進行排序
然後將有序數組用來運算
6.2高斯消去法:
初等行變換將原矩陣轉變成上三角矩陣然後自底向上進行求解
第一種:從第一行到倒數第二行循環,對其餘行進行每個元素循環,減去標杆行修改元素和本行修改元素的比例(效率低)
第二種:從第一個元素到倒數第二個元素,遍歷,將對應列的最小的放在最前面,交換行,然後對其餘行和該行按修改元素比例進行做差
6.2.1LU分解:
U爲上三角矩陣(高斯消去法得出)
L爲對角線爲1,其餘爲比例係數的下三角矩陣
Ax=b即爲LUx=b
設Ux = b 則爲 Ly = b
解y->然後解Ux = y
6.2.2計算矩陣的逆:
退化矩陣:矩陣無法計算逆,逆不存在
非退化矩陣:高斯消去法得到的矩陣對角線上面無0元素即爲非退化矩陣
需要計算n2個元素
AB = E
Axj = ej 矩陣A乘以矩陣B的xj列 = 矩陣E的ej列(j∈(1,n))
6.2.3計算矩陣的行列式(計算矩陣的值)
元素下角標之和 奇負偶正
然後乘以代數餘子式
6.3平衡查找樹:
6.3.1AVL樹:
對左右子樹求高度差,高度差的絕對值均小於2的二叉查找樹(左子樹小於根節點,右子樹大於根節點)即爲AVL樹
通過旋轉使得新插入節點導致不平衡的AVL樹重新變得平衡,通過修改距離插入節點最近的節點來使得AVL樹平衡,
時間複雜度logn
6.3.2 2-3樹:
2-3樹即樹可以包含兩種類型的節點:兩個節點和三個節點
兩個節點:一個鍵,兩個子女
三個節點:兩個鍵,三個子女,左小於min,中∈(min,max),右大於max
2-3樹總是高度平衡的,樹種所有的葉子必須在同一層
2-3樹中插入新節點的做法:二節點的找到合適的位置(小於原來的鍵或者大於原來的鍵)插入,三節點的插入後分裂,最小的鍵分到左側葉子,中間的升入父母節點,最大的放在右側葉子
6.4堆和堆排序
堆用二叉樹表示,且滿足兩個特性:
1.完全二叉樹,只有最後一層的右測可以缺
2.父母優勢,父母節點大於所有子女節點
實際用數組表示,第一個空出來
前n/2向下取整是父母節點,後n/2向上取整是子女節點,按照從左到右次序排列
父母節點爲i 子女節點爲2i 2i+1 子女節點爲i 父母節點 i/2向下取整
構造堆兩種方法:
1.自底向上構造堆
先按照給的生成完全二叉樹,然後作交換保證父母優勢,不能則跟子女節點最大的作交換,從最後的父母節點開始,到根,交換後檢查交換過來的小節點是否滿足父母優勢
時間效率O(n)
2.自頂向下構造堆
插入節點方法,然後將新插入的節點和父母節點作比較,直到滿足父母優勢爲止
刪除節點的方法:
將要被刪除的節點和最後一個節點做交換,規模減一,然後自底向上堆化
6.5霍納法則和二進制冪
6.5.1霍納法則
將含x的多次多項式的式子不斷提x進行拆解,直到不存在x的多次式
係數從左到右排序
6.5.2二進制冪
1.從左到右的二進制冪
將次方拆成2進製表示 1從左邊起每位都平方然後0次方不變1次方+1
2.從右到左的二進制冪
將次方拆成二進制表示 每個二進制位對應a的2的二進制位次方,1則存在,0則不存在
6.6問題簡化
6.6.1最小公倍數的問題
1.找出每個的因子相同個數的乘一遍其餘不同的各自乘一遍
2.lcm = mxn/gcd(m,n)去除最大公約數
6.6.2計算圖中的路徑數量
第i個頂點到第j個頂點,長度爲k的路徑的數量 = pow(A,k)對應(i,j)位置的數目
A爲鄰接矩陣
6.6.3優化問題的化簡
最大化問題和最小化問題的互相轉化
max = -min min
6.6.4線性規劃問題
揹包問題的線性規劃解法,給定目標和約束
6.6.5簡化爲圖的問題
同標題