演算法複習筆記(三)分治法

2021-08-20 06:47:16 字數 1170 閱讀 5228

演算法複習筆記(三)分治法

分治法劃分對策:

子問題與原問題相比:問題性質一致,問題規模不同

求解一般分為三個階段:

1.劃分:直到問題足夠小可以直接求解為止

2.求解:

3.合併:將子問題的解合併為乙個更大規模的問題的解,自底向上逐步求出原問題的解。

我們給出下面這個理智引入分治技術

⚠️:不是所有的分治法都比簡單的蠻力法更有效

數值螺旋方陣(非典型例題)

直接敷上**,不做過多結束

兩路歸併排序的分治策略

(1)劃分:將待排序序列劃分為兩個

(2)求解子問題:對兩個子串行進行排序,得到兩個相等的有序子串行

(3)合併:將兩個有序的子串行合併成乙個有序序列

歸併排序演算法實現:

void mergesor()

} void merge(int r,int r1,int m,int t)//合併兩個子串行

剛開始學二路歸併的時候總是容易陷進去這部分是如何實現排序的問題,其實學習到現在,要學會有巨集觀的意識:

我們解決這個問題,先把問題等分了,然後對等分部分繼續劃分知道可以直接求出子問題,然後合併

因此我們看到,我們先歸併前半部分 前半部分的前半部分知道可以直接求解,後合併,以此迴圈,

如下圖例子

歸併排序的時間複雜度為nlogn,由於合併過程中需要與原始序列同樣數量的儲存空間,因此起空間複雜度o(n)

(1)劃分:選定乙個記錄作為軸值,以軸值為基準將整個序列劃分為兩個子串行r1....ri-1...rn,前乙個子串行中記錄的值均小於或等於軸值,後的均大於軸值

(2)求解子問題:分別對劃分後的每乙個子串行遞迴處理(使用遞迴函式)

(3)合併:排序是就地執行,所以合併不需要執行任何操作

附上快速排序的**:

#incldue
在最好情況下一次劃分需要對待排序列掃瞄一遍,則所需時間為o(n),遞推擴張時t(n)<=2t(n/2)+o(n),在最好情況下時間複雜度為o(nlog2n),最壞情況下的時間複雜度;o(n的二次方),其平均時間複雜度o(nlog2n),空間複雜度也是如此

走迷宮題目:

演算法筆記(三) 分治法(快速排序)

參考了網上大神的理解後,自己也嘗試著寫下傳說中的 快速排序 大致思路總結為 挖坑填坑 分治法。舉個例子 我們對陣列a 9 進行分析。首先我們拿陣列中的隨機乙個數作為基準數 參照物件,也就是要挖的坑 把基準數變成坑 用 x 來表示 然後我們把它和陣列的第乙個數字置交 比如我們拿到的基準數為5,那麼新陣...

複習筆記 三分演算法

考試考到了三分,但是我忘了 qwq 似乎沒啥好說的,三分用於求單峰函式 f x 的最值。存個板子,分別是整數和浮點數的。如果忘了的話可以看一下 這個,寫得還比較清楚。在實際實現過程中,為了避免卡精度 死迴圈之類的 發生,可以適當將 eps 設得大一點 指整數邊界的差值,浮點數要看題目要求喏 在用三分...

平面最近點對問題,三分治法。

最近點對問題,三分治法,和求中位數思路是一樣的,1,隨機選乙個數x,線性掃瞄,比x小的一堆a,比x大的一堆b,同時可以得到min min minb x,x maxa 2,對於這兩堆,分別重複1的步驟,直到結束。求中位數,需要拋棄掉一半資料,只求其中乙個子集合的n 2 k大即可。演算法概論 上有證明遞...