演算法設計與分析 分而治之演算法 金塊問題

2021-08-31 13:53:18 字數 1480 閱讀 6326

目錄

題目描述 

問題分析

**編寫

列印結果

老闆有一袋金塊(共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 ...