分治演算法以及典型例題

2021-09-26 23:30:32 字數 1006 閱讀 3261

(1) 可以將大問題分解,分解後的問題容易解決

(2) 分解後的子問題是同一種類,並且具有最優子結構性質(下面會解釋)

(3)分解後的子問題解決後可以合併

(4)分解後的子問題沒有公共問題(dp可以解決)

ps:最優子結構:區域性最優解是全域性最優解的一部分,即當前的狀態是最優的,與後面的決策沒關係(同動態規劃與貪心)

以上條件都滿足,就可以用分治啦

分治,字面上的解釋是「分而治之」,就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解。

隨意看一下就好了

(1)分解為許多子問題

(2)解決子問題

(3)解決合併問題

題意:已知n個數,求第k大數。

如果用sort從大到小排序再二分時間複雜度為o(nlogn)

但是如果用歸併排序為o(n),而且剪短

原理:每次取劃分後的序列中的第乙個數x,將序列劃分為2個集合,

比較大小

(1)如果中的元素個數為k-1個,則x為第k個數

(2)如果中的元素個數為大於k-1個,x比所求小,第k大數在集合中,繼續劃分集合。

(3)如果中的元素個數為小於k-1個,x比所求大,第k大數在集合中,繼續劃分集合。

下面看**及注釋

#includeusing namespace std;

int a[ ];

int find(int l, int r)

a[l] = tmp;

return l;

}//求比x小的集合個數

int ask(int l, int r, int k)

int main()

我仔細看了一下,其他的題都是利用分治優化,但大多都沒有什麼影響,**還長,其精華主要在於它的思考方式,上面的題是乙個典型的例子,希望讀者好好領會,以及究竟是怎麼找比x小的數,幾次賦值十分精彩

祝大家前途似海,來日方長

雙指標演算法以及一些典型例題

一 雙指標演算法兩種常見的問題分類 1 對於兩個序列,維護某種次序,比如歸併中合併兩個有序序列的操作 2 對於乙個序列,用兩個指標維護一段區間 注意,這裡雖然說雙指標,但不代表是真正的兩個指標,你可以理解為兩個變數i,j 但是這兩個變數i,j它們是一直向前行進的,是不會後退,就拿kmp來說,其實它也...

基礎演算法例題(遞迴 分治 )

遞迴 include include includeusing namespace std void comp int arr,int l,int r,int max1,int max2 else if r l 1 else else int main printf n comp a,0,n 1,m...

數論的典型例題

1 本原勾股數 概念 乙個三元組 a,b,c 其中a,b,c沒有公因數而且滿足 a 2 b 2 c 2 首先,這種本原勾股數的個數是無限的,而且構造的條件滿足 a s t,b s 2 t 2 2,c s 2 t 2 2 其中s t 1是任意沒有公因數的奇數!由以上概念就可以匯出任意乙個本原勾股陣列。...