乙個老闆有 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 使用...