斯坦福演算法設計和分析 3 分治演算法

2021-10-19 18:44:22 字數 2128 閱讀 3951

​本文預計閱讀時間4分鐘,在讀的過程中你需要帶著以下問題:

分值策略一般步驟

把輸入劃分成更小的子問題。

遞迴的治理子問題。

把子問題的解決方案組合到一起,形成原始問題的解決方案。

應用: 逆序對數目

輸入包含不同整數的陣列a, 輸出a中逆序對的數量,逆序是指: 如果 i < j 而 a[i] > a[j],那麼 (i, j) 就是一組逆序對。

比如輸入的陣列是

其中i = 2對應a[2] =3 ,j=4對應a[4]=2,2<4, 但是a[2] > a[4],所以這是一組逆序對。

協同篩選

為什麼要對陣列的逆序對計算?

乙個原因是想要計算一種數值相似度,該數值的相似度用於對兩個已排序列表之間的相似度進行量化。比如兩個人都看過10部電影,按照從最喜歡到最不喜歡的順序進行排列,那麼怎麼衡量兩個人的選擇是相似還是不相似的呢?解決這個問題的一種量化方法就是通過包含10個元素的陣列a,a1表示讀者的朋友從電影列表中選擇最喜歡的電影,a2表示他喜歡第二的電影,以此類推,a10表示他最不喜歡的電影,這樣如果讀者最喜歡的電影是星球大戰,而這部電影在讀者的列表中只顯示的第5位,那麼a1就等於5,如果兩個人的排序是相同的,這個陣列就已經排序了,不存在逆序對,如果這個陣列包含的逆序對越多,讀者和朋友之間對電影評價的分歧就越多,對電影的偏好就不同了。

暴力解法

我們首先想到的就是暴力窮舉搜尋法,輸入乙個陣列a,裡面包含不同的整數,輸出的是它的逆序對個數,以上就是暴力解法的偽**。外層迴圈i表示從左到右的遍歷陣列a中的元素,內層迴圈j是沒有與i對比過的元素,逆序了就累加。它的缺點是時間複雜度很高,o(n^2)。

分而治之思想

如果我們用分治演算法來算這個問題的話,第乙個步驟就是把陣列a劃分成更小的子問題,我們把a平均的劃分成兩個部分,左邊和右邊,這樣陣列規模就變小了,這樣劃分下就有三種情況:

接下來我們需要解決子問題,對於情況1,2其實就是呼叫自身的遞迴,所以我們只用實現第3鐘情況countsplitinv。

mergesort思想

在countinv的偽**中,需要實現countsplitinv函式,我們之前講的mergesort排序演算法天然的可以計算逆序對數目,而它實現的思路又是兩個已排序的陣列合併成乙個新陣列,上面的countinv的情況3實際就是i在左邊陣列中,j在右邊陣列中,而左右兩邊的陣列沒有排序,所以我們對他兩排一下序就能引用mergesort演算法。我們稍微的修改一下上面的偽**,使得遞迴後除了返回逆序對數目,還要返回排序後的陣列,下面是修改後的偽**。

那麼以上在處理逆序對 i, j 乙個在左邊乙個在右邊這種情況的時候,就可以用上之前的mergesort演算法,現在我們來回顧一下。

以上是mergsort的偽**,它是輸入已排序的c和d,輸出是排序好的b。i,j分別控制c,d的元素,哪個元素小就把它加入到b中。那麼,這裡的c就是原問題中的左半部,d就是原問題的右半部分,當c[i] > d[j] 的時候,說明產生了逆序對,而c又是排序後的,所以i之後的數字都是大於d[j]的,所以對於d[j]所帶來的逆序對數目就是c陣列i到最後的元素個數,所以,我們可以在排序的基礎上計算出逆序對個數。把這一段話翻譯成偽**就是如下。

這樣就完成了分治演算法對於逆序對的計算。時間複雜度是o(nlogn),比暴力搜尋快很多。文章開頭的問題你想通了嗎?

常用演算法3 分治法 Leetcode

所謂分治就是把整個問題分成無關緊要的小問題 執行步驟 劃分問題 整個問題劃分成多個無關聯的子問題。遞迴求解 遞迴呼叫求解各個子問題。合併問題 合併子問題的解,形成原始問題的解 給定乙個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣...

演算法分析與設計實踐 作業5 分治最近對問題

有n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。歐幾里得距離計算公式 將集合s分成兩個子集s1和s2,根據平衡子問題原則,每個子集中的點數大致都為n 2。這樣分治後,最近點對將會出現三種情況 在s1中,在s2中或者最近點對分別在集合s1和s2中。利用遞迴分析法分別計算前兩種情況,第三種方...

演算法設計與分析(edu實訓)實驗五 分治法

任務描述 本關任務 利用分治法求一組資料中最大的兩個數和最小的兩個數。程式設計要求 請在右側編輯器begin end處補充 完成本關任務。測試說明 平台會對你編寫的 進行測試,比對你輸出的數值與實際正確數值,只有所有資料全部計算正確才能通過測試 測試輸入 10 資料的總個數 1 此行及以下為具體的每...