兩個高效技巧 活用遞推和隨機選擇演算法

2021-10-03 22:31:42 字數 1125 閱讀 9260

有很多題目需要細心考慮過程中是否可能存在遞推關係,如果能找到這樣的遞推關係,就能使時間複雜度下降不少。例如就一類涉及序列的題目來說,加入序列的每一位所需要計算的值都可以通過該位左右兩側的結果計算得到,那麼就可以考慮所謂的「左右兩側的結果」是否能夠遞推進行預處理來得到,這樣在後面的使用中就可以不比反覆求解

讓我們看乙個例子:

通過仔細思考,我們可以發現,每對乙個確定的a,它能形成pat的個數等於左邊p的個數和右邊t的個數的乘積。

int

countpat

(string str)

for(

int i = str.

length()

; i >=0;

--i)

}free

(a);

return countpat;

}int

main()

隨機選擇演算法主要解決這樣一類問題:

如何從乙個無序的陣列中求出第k大的數

顯然我們的第一想法是先排序好後在查詢第k大的數,這樣的複雜度為o(nlogn),那麼我們有沒有更好的方法呢?

回憶一下快速排序演算法,每一趟都選擇乙個主元,排序後左邊元素小於主元,右邊元素大於主元,這是我們可以進行判斷主元和k的關係,如果比k小我們再去遞迴算主元左邊的元素,如果比k大我們就去遞迴算主元右邊的元素,這樣我們的時間複雜度可以達到o(n)

int

randpartition

(int a,

int low,

int high)

a[i]

= tmp;

return i;

}int

randselect

(int a,

int low,

int high,

int k)

intmain()

cout<<

randselect

(a,0

, num -

1, k)

;}

兩個SQL技巧 排序和條件判斷

利用虛擬列完成置頂等特定排序 將狀態為2的人,置頂。select name,age,state,decode state,2,1,0 as flag from table1 where order by flag desc 通過decode方式增加一列虛擬列,使當state為2的時候,flag值為1...

兩個NOI題目的啟迪 皇后和算24

論出於什麼原因和目的,學習 已經有乙個星期左右,從開始就在做 的題目,到現在也沒有正式的看 primer c 不過還是受益良多,畢竟 是一種 低階的高階語言 而且 上的題目可以說是循序漸進。不僅僅是從 的角度看程式語言,這讓我對程式語言語言的理解有了一些深入。這一篇來記錄一下 基本演算法之搜尋 的兩...

SAP和ISAP(網路最大流的兩個增廣路演算法)

isap是對sap進行優化後的演算法,isap時間複雜度為o v 2e sap的時間複雜度為o ve 2 sap include include include include using namespace std const int maxn 100 const int inf 1 30 1 i...