分治演算法求螺絲螺母匹配問題

2021-10-10 22:46:51 字數 1132 閱讀 1658

有個大小不同的螺絲和與之匹配的n個螺母, 你可以嘗試乙個螺絲和乙個螺母是否匹配, 嘗試結果有三種:(1)螺絲太大;(2)匹配成功;(3)螺母太大. 請設計乙個分治演算法完成所有螺絲和螺母的匹配

邊界條件:當只有乙個螺絲和乙個螺母時,匹配螺絲和螺母。

divide:在杯子集合中隨機選擇乙個螺絲x, 將x與所有螺母進行匹配,把結果為螺絲太大的螺母放入g1, 把結果為螺母太大的螺母放入g2, 找到和x匹配成功的螺母記為y。將y與x以外所有杯子進行匹配,把結果為螺母太大的螺絲放入b1, 把匹配結果為螺絲太大的螺絲放入b2。

conquer:遞迴地對b1和g1、b2和g2進行匹配。

merge:返回b1和g1、b2和g2的匹配結果以及(x, y)。

match(b, g)

input: 螺絲集合b, 螺母集合g, |b|=|g|=n, b中每個螺絲都只和g中乙個螺母匹配成功

output:

if |b|=1

return bg;

初始化b1, b2, g1, g2, m=; y=nil;

隨機選擇螺絲集合b中的乙個元素x;

for g

if g和x的匹配結果為「螺絲太大」

令g1=g1;

else if g和x的匹配結果為「螺母太大」

g2=g2;

else ;

}for b/

if y和b的匹配結果為「螺母太大」

b1=b1;

else if g和x的匹配結果為「螺絲太大」

b2=b2;

if b1

m=mmatch(b1, g1);

if b2

m=mmatch(b2, g2);

return m;

記演算法時間複雜性t(n)。 將x與所有螺母匹配代價為o(n); 將y與x以外所有螺母匹配的代價為o(n); 綜上, 劃分代價為o(n)。conquer 代價為t(|b1|)+t(n-1-|b1|), 其中|b1|為0、1、…、n-1的概率都是1/n。combine(merge)代價不計(演算法的時間複雜性用匹配嘗試的次數來衡量)。 總體代價與快速排序相同, 最壞情況為o(n2); 期望為o(nlogn)。

演算法 螺絲螺母問題

給你一堆螺母和螺帽,每個螺母都有乙個相對應的螺帽,但是他們之間的對應關係已經打亂。你可以比較螺母和螺帽的大小關係,但是你無法比較螺母和螺母的大小關係,你也無法比較螺帽和螺帽的大小關係。設計乙個演算法,找出螺母和螺帽的對應關係。include include using namespace std v...

螺釘螺母的匹配問題

螺釘螺母的匹配問題 很早之前就看到一道關於螺釘螺母的acm題目的。最近又看了 分治法 的思想,於是強迫自己去把這個 寫出來!題目如下 給你一堆螺母和螺帽,每個螺母都有乙個相對應的螺帽,但是他們之間的對應關係已經打亂。你可以比較螺母和螺帽的大小關係,但是你無法比較螺母和螺母的大小關係,你也無法比較螺帽...

分治演算法 求逆序對

題目 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。解析 這道題 只要雙重迴圈就可以解決 但是因為題目要求 所以被迫使用更麻煩的方法 這道題其實就是歸併排序 至於為何 就不說了 歸併排序 就是將乙個陣列 不斷分割 一直分割到只剩乙個為止 乙個的話 必定是有序的 ...