分治法是乙個廣泛的概念
// 往往是在merge階段搞名堂,真正解決問題。
2 簡化重複計算
1.1 最大子陣列問題
原本需要n^2時間,而發現跨越中點的(確定了中間一點的)最大子陣列可以在o(n)時間內解決,
於是分治:t(n) = 2t(n/2) + o(n)
=> o(nlgn)
1.2 最近點對問題(二維歐幾里得距離)
原本需要兩兩遍歷一遍o(n^2),而發現跨域中線的點對可以在o(n)時間內解決,
於是分治:t(n) = 2t(n/2) + o(n)
=> o(nlgn)
1.3 找陣列中數量過半的那個元素,不存在序關係,只能比較是否相同
該陣列平均分為兩部分,則主元素為兩部分中至少一部分的主元素,故而:
遞迴地查詢兩部分p1, p2的主元素m1, m2,若
m1和m2相同,則即為主元素;
m1和m2不同,則主元素必為m1, m2中的乙個,o(n)遍歷一遍p1, p2就可以找出;
t(n) = 2t(n/2) + o(n)
對於這個問題,選用分治法是因為:
1.在merge階段,可以巧妙地用o(n)實現,而非直接處理所需的o(n^2);
2.化分出的微小子問題可以輕易的解決。
仍需指出,存在著比分治更快的演算法,在o(n)時間內兩兩遍歷每個元素,若兩個元素不同,則刪去它們,這樣不影響剩餘部分的主元素。
2.1 大整數乘法
通過觀察,簡化了需要重複計算的部分
2.2 矩陣乘法的strassen乘法
矩陣四等分後乘法直接計算不會比樸素演算法快,而在細分發現了重複計算的部分,於是可以省略
2.3 快速冪
在計算冪次乘法的過程中發現了需要重複計算的部分,於是可以簡化計算;
本質上,是把較高次冪的運算化分為較低次冪的計算,細分出來的較低次冪容易快速計算,再把它merge起來,分治思想是這樣體現的。
什麼時候考慮使用靜態
這些各種說法,基本上都是正確的。但是,其中絕大多數是講了 靜態 和 例項 的區別,以及靜態方法的特徵。很少有說到何時或是為什麼要使用靜態的。靜態包括靜態類和靜態成員 靜態方法 和 靜態屬性 既然搜尋出來的這些說的都是靜態成員 基本上說的都是靜態方法 那麼我也就先僅對靜態方法談一談自己的看法。上中學數...
什麼時候我們考慮使用指令碼
指令碼的架構 指令碼宿主 在其中執行 iis,ie,wsh wscript,cscript 指令碼引擎 解釋程式 windows作業系統內建的 vbscript 與jscript 指令碼可以呼叫的物件模型 wsh,wmi,adsi,ado,cdo等 wsh 可以呼叫com物件,使用命令列,呼叫she...
什麼時候使用引用 什麼時候使用指標
使用引用引數的主要原因有兩個 程式設計師能修改呼叫函式中的資料物件 通過傳遞引用而不是整個資料 物件,可以提高程式的執行速度一般的原則 對於使用引用的值而不做修改的函式 如果資料物件很小,如內建資料型別或者小型結構,則按照值傳遞 如果資料物件是陣列,則使用指標 唯一的選擇 並且指標宣告為指向cons...