目錄
題目描述
問題分析
**編寫
列印結果
老闆有一袋金塊(共n塊,n是2的冪(n≥2)),最優秀的雇員得到其中最重的一塊,最差的雇員得到其中最輕的一塊。假設有一台比較重量的儀器,希望用最少的比較次數找出最重和最輕的金塊。 對於一般思路:通過乙個函式max進行n-1次比較來找到最重的金塊,然後再從餘下的n-2個金塊中用同樣的方法min函式找到最輕的金塊,這樣,比較的總次數為2n-3。對於 分治法:(分治法是將問題劃分為若干個子問題,然後通過求解子問題的解來獲得原問題的解)
先考慮n≤2的情況
①當n=1時,即只有一塊金子,此時無需進行比較
②當n=2時,此時只需比較一次就可以判斷出最重和最輕的金塊
對於n>2的情況
第一步,將金子平均分成兩份a,b
第二步,分別在a,b中找到最重和最輕的金塊
第三步,再次比較a中最重的金子和b中最重的金子,a中最輕的金子和b中最輕的金塊
時間複雜度:
若n=0
t(n)=0
若n=1
t(n)=1
若n>2
t(n)=2t(n/2)+2
通過master定理可得為o(n)
**的總體設計邏輯就是將n個金塊分成等量的兩份a,b,然後再將a分成等量的兩份(若a中金塊的數量n1>2),然後再次等量分,通過一次次的劃分,找到符合n=1或n=2的情況,然後直接進行比較,總體來說就是不斷的遞迴
#include//比較重量大小的函式
int min(int x,int y)
int find_min(int a,int left,int right) //這裡是尋找最輕的金塊的函式
if(right-left==1) //對於n=2的情況
if(right-left>1) //對於n>2的情況
}
int find_max(int a,int left,int right) //尋找最重金塊的函式
if(right-left==1)
if(right-left>1)
}
int main()
{
int a[100];
int n;
int min;
int max;
printf("請輸入金塊數目:");
scanf("%d",&n);
printf("請輸入各金塊的重量:");
分而治之演算法
今天的演算法是乙個叫分而治之的思想,這個思想感覺對於程式優化,節約時間很有幫助,但是對於實際中的用途還是稍微差了點!這個思想很簡單即使把乙個大的程式,分成一小段一小段的區分步執行,這樣的好處就是減少複雜度,比如我們要計算2的100次方,我們通常的思想就是 for int i 0 i 100 i 好吧...
分而治之演算法
演算法是問題的分步驟解決的方法。分而治之的思想是 有很多問題,可以劃分為多個小問題,而小問題本身是易於解決的,那麼就通過找到 劃分方法 得到小問題後,最終解決原問題。一 是否所有問題都能劃分成小問題?比如1 1 可以劃分麼?不行。因此並不是所有問題都能夠劃分。二 怎樣的問題能夠劃分?和規模n相關的,...
演算法設計與分析
輸入輸出 確定性有窮性 np類問題是非確定性計算模型下的易驗證問題類。所有可以在多項式時間內求解的判定問題構成p類問題 1 二分搜尋技術 二分搜尋演算法的基本思路是對給定已排好序的n個元素a 0 n 1 在這n個元素中找出乙個特定元素x。運用分治的思想,將n個元素以n 2為中心對半分。if x a ...