分治法 蠻力法 金塊問題

2021-09-30 12:08:22 字數 1275 閱讀 8362

乙個老闆有 n 塊金塊,他要把最重的一塊獎勵給最優秀的員工,最輕的一塊獎勵給次優秀的員工。假設有一台比較重量的儀器,希望用最少的比較次數找出最重和最輕的金塊。

題意就是在一堆亂序元素中找到兩個最值元素:最大值、最小值

本題解法思路有兩種:分治法、蠻力法

分治演算法實現上,又可以分兩種思路:遞迴、非遞迴

只看比較次數的話,分治法比較次數穩定,蠻力法比較次數可能最優也可能最差

分:用二分思想將所有金塊分成很多小份,每小份金塊數量小於或等於2塊。

治:金塊數量小於或等於2塊的集合可以直接比較,找出每乙份的最大值和最小值。然後每兩份金塊相互比較,找出最大值和最小值,以此類推,直到剩下唯一的最大值和最小值,就是最重的金塊和最輕的金塊。

// 返回陣列:[min, max]

public int searchminmax(int golds)

private int search(int golds, int left, int right) ;

} else

}

非遞迴演算法比遞迴演算法有個優勢:資料量增大時,只要jvm堆記憶體足夠,就沒有方法棧溢位的呼叫問題(遞迴的弊端)。

從演算法程式執行的時間順序上看,遞迴的過程是「邊分邊治」,非遞迴的過程是「先分後治」。

// 返回陣列:[min, max]

public int searchminmax(int golds)

private listdivide(int golds) );

}// 金塊數量是奇數時,最後一塊單獨成乙份,既是最大值又是最小值

if (length % 2 == 1) list.add(new int);

return list;

}private int conquer(listlist)

if (size % 2 == 1) temp.add(list.get(size - 1));// 奇數時的最後乙份

list = temp;

}return list.get(0);

}

隨便拿出乙個金塊,把它當作最重金塊,同時也把它當作最輕金塊。然後遍歷剩下的金塊集合,如果有比最重金塊還重的,就替換最重金塊,如果有比最輕金塊還輕的,就替換最輕金塊。遍歷完以後,就得到最重金塊和最小金塊。

// 返回陣列:[min, max]

public int searchminmax(int golds)

return new int;

}

C 用蠻力法與分治法解決最近對問題

設 p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,最近對問題就是找出集合s中距離最近的點對。嚴格地講,最接近點對可能多於一對,簡單起見,只找出其中的一對即可。簡單起見,只考慮二維的情況並假設所討論的點以標準笛卡爾座標形式給出。因此,兩個點pi xi,yi 和pj ...

蠻力法 獄吏問題

某國王大赦囚犯,讓一獄吏n次通過一排鎖著的n間牢房,每通過一次,按所定規則轉動n間牢房的某些門鎖,每轉動一次,原來鎖著的門被開啟,原來開啟的門被鎖上,通過n次後,門開著的,牢房中的犯人放出,否則犯人不得釋放。轉動門鎖的規則是這樣的,第一次通過牢房,從第1間開始要轉動每一把門鎖,即把全部的鎖開啟 第2...

分治法和蠻力法MATLAB求最近點對

主程式 main.m clear clc n 20 隨機生成20個點 a rand n,2 10 將20個點按橫座標公升序排列 a sortrows a,1 蠻力法求隨機點的最近點對 mindist,x1,x2 bcloest a,1,n mindist1,y1,y2 cloest a,1,n 使用...