資料結構與演算法(5)減治法

2021-10-04 10:50:44 字數 1798 閱讀 6135

減治法(reduceandconquermethod)在將原問題分解為若干個子問題後,利用了原問題的解與子問題的解之間的關係,

這種關係通常表現為:

(1)原問題的解只存在於其中乙個較小規模的子問題中;

(2)原問題的解與其中乙個較小規模的解之間存在某種對應關係。

由於原問題的解與較小規模的子問題的解之間存在這種關係,

所以,只需求解其中乙個較小規模的子問題就可以得到原問題的解,無須對子問題的解進行合併。

因此,嚴格地說,減治法應該是一種退化了的分治法。

減治法主要有以下三種型別:

演算法每次迭代總是從例項規模中減去乙個相同的常量,一般來說,這個常量等於1。

直接插入排序、拓撲排序等都是減1技術的應用例項。

演算法每次迭代總是從例項規模中減去乙個相同的常數因子,一般來說,這個常數因子等於2(即減半)。

折半查詢、平衡二叉樹的查詢、b樹的查詢、堆調整等都是減半技術的應用例項。

演算法每次迭代時減去的規模都是不同的。

歐幾里得演算法、二叉排序樹的查詢等都是減可變規模的應用例項。

【問題】 在n枚外觀相同的硬幣中有一枚是假幣,並且已知假幣較輕。

可以通過一架天平來任意比較兩組硬幣,從而得知兩組硬幣的重量是否相同,或者哪一組更輕一些。

假幣問題是要求設計乙個高效的演算法來找出這枚假幣。

【想法】 問題的解決是經過一系列比較和判斷,最自然的想法就是一分為二,也就是把n枚硬幣分成兩組,每組有└n/2」枚硬幣,如果n為奇數,就留下一枚硬幣,然後把兩組硬幣分別放到天平的兩端。如果兩組硬幣的重量相同,那麼留下的硬幣就是假幣;否則,用同樣的方法對較輕的那組硬幣進行同樣的處理,因為假幣一定在較輕的那組裡。由於每次用天平比較後,只需解決乙個規模減半的問題,所以,它屬於減治演算法。該演算法在最壞情況下的時間效能滿足如下遞推式:

通用分治遞推式的定理,得到t(n)=o(log2^n)。

實際上,減半不是乙個最好的選擇。考慮不是把硬幣分成兩組,而是分成三組,前兩組有「n/3┐個硬幣,其餘的硬幣作為第三組;將前兩組硬幣放到天平上,如果它們的重量相同,則假幣一定在第三組中,用同樣的方法對第三組進行處理;如果前兩組的重量不同,則假幣一定在較輕的那一組中,用同樣的方法對較輕的那組硬幣進行處理。

顯然這個演算法存在遞推式:

這個遞推式的解是t(n)=o(log3n)。這個減治法是將原問題一分為三,從而獲得了更少的比較次數。

設n枚硬幣的重量儲存在陣列a[n]中,函式coin實現假幣問題的求解,引數low和high分別表示假幣所在的陣列下標範圍,為避免傳遞陣列引數,將a[n]設為全域性變數。

程式如下:

減治法演算法設計

首先要申明的是減治法思想並不等同於分治法思想,減治法技術利用乙個問題給定例項的解和同樣問題較小例項的解之間的某種關係。一旦建立了這種關係,就可以從頂至下 遞迴 或者從底之上 迭代 地來運用該關係。減治法有3種主要的變種 1 減去乙個常量 2 減去乙個常量因子,大多數問題中常量因子為2 3 減去的規模...

資料結構與演算法 分治法

1 用分治法設計與實現歸併排序演算法。2 給定含有 n 個元素的多重集合 s,每個元素在 s 中出現的次數稱為該元素的重數。多重集合 s 中重數最大的元素稱為眾數。例如多重集合 s 其中眾數是 2,其重數為 3。用分治法設計並實現在多重集合中找眾數及其重數的演算法,要求演算法的時間複雜性在壞情況下不...

資料結構與演算法 中心擴散法

中心擴散法,顧名思義就是以某乙個位置為中心,向周圍擴散,直到滿足條件或到達邊界。題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解題思路 遍...