分治算法詳解+相關面試題總結(C++版)

分治算法的思想

分治算法的思想就是原問題可以轉換成問題更小的子問題,並且子問題的求解方法和原問題相同,只是規模不同。因此我們就可以將原問題層層分解成小問題,直至小問題能夠直接進行求解。然後對小規模的問題進行求解,然後將求得的解層層向上合併,合併成原問題的解。

分治法的步驟如下:

第一步 分: 將原來複雜的問題分解爲若干個規模較小、相互獨立、與原問題形式相同的子問題,分解到可以直接求解爲止。

第二步 治: 此時可以直接求解。

第三步 合: 將小規模的問題的解合併爲一個更大規模的問題的解,自底向上 逐步求出原來問題的解。

由於分治法需要將問題進行分解,並且要將問題求得的解進行合併,因此常用遞歸的方法來進行。分治法的一般的算法模式如下所示:

Divide_and_Conquer(P){
    if(xxx) //遞歸出口:如果規模足夠小,剋制直接求解,則開始“治”
        return ADHOC(P); //ADHOC是治理可直接求解子問題的子過程
     
    <divide P into smaller subinstances P1,P2,...Pk>; //將P“分”解爲k個子問題
     
    for(int i = 0; i < k; ++i)
        yi = Divide_and_Conquer(Pi); //遞歸求解各個子問題
     
    return merge(y1, y2, ..., yk); //將各個子問題的解“合”併爲原問題的解
}

常見面試題:

分治法作爲四大算法之一,在面試、筆試的時候常常被問到,在這裏總結幾個面試題,我整理過的我會將連接附在下面,沒有整理過的大家可以自行查閱。

1.二分法的遞歸和非遞歸算法。

https://blog.csdn.net/qq_42214953/article/details/106387714

2.有兩個大小都都爲n升序int數組,查閱第n小的數值。

https://blog.csdn.net/qq_42214953/article/details/106391347

3.全排列

https://blog.csdn.net/qq_42214953/article/details/106932102

4.線性時間選擇

https://blog.csdn.net/qq_42214953/article/details/106410325

5.求數組中的衆數

https://blog.csdn.net/qq_42214953/article/details/107064328

6.最接近點對問題(一維、二維)

7.一個袋子裏面有若干硬幣,其中一枚是假幣,並且假幣和真幣一模一樣,目前只知道假幣比真幣輕一點,請問如何選擇?

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章