基本算法思想Java實現的詳細代碼


基本算法思想Java實現的詳細代碼


算法是一個程序的靈魂,一個好的算法往往可以化繁為簡,高效的求解問題。在程序設計中算法是獨立於語言的,無論使用哪一種語言都可以使用這些算法,本文筆者將以Java語言為例介紹一些常用的算法思想。

分類

  1. 窮舉算法思想
  2. 遞推算法思想
  3. 遞歸算法思想
  4. 分治算法思想
  5. 概率算法思想 

窮舉算法思想

窮舉算法的基本思想

從所有可能情況中搜索正確答案 
1. 對於一種可能情況,計算其結果。 
2. 判斷結果是否滿足,如不能滿足者執行第一步來搜索下一個可能的情況;如滿足則表示選找到一個正確答案。

窮舉算法實例

僅有雞兔同籠,上有三十五頭,下有九十四足,問雞兔各幾何?

算法實現


int Qiongju(int head,int foot)
{   
    int i,j,chicken,rabbit;
    for(i=0;i<=head;i++)
    {
        j = head-i;
        if(i*2+j*4==foot)
        {
            chicken = i;
            rabbit = j;
            return 1;
        }
    }
    return 0;
}

遞推算法思想

遞推算法基本思想

遞推算法是一種理性思維模式的代表,其根據已有的數據和關系,逐步推到而得到結果。對推算法的執行過程:

  1. 根據已知結果和關系,求解中間結果
  2. 判定是否但到要求,若沒有繼續執行第一步,若有則表示找到一個正確結果 
    遞推算法往往需要知道答案和問題之間的實際邏輯關系。再許多數學問題中往往都有着明確的計算公式可以遵循,因此可以采用遞推算法來實現。

    遞推算法實例

    斐波那契數列:兔子產仔問題 
    題目:如果一對兩個月大的兔子以后每個月都可以生一對小兔子,而剛出生的兔子兩個月后才可以生小兔子,假定一年內沒有兔子死亡事件,那么一年后共有多少對兔子呢?

實現算法

int Fibonacci(int n)
{
    int t1,t2;
    if(n==1||n==2)
    {
        return 1;
    }
    else
    {
        t1 = Fibonacci(n-1);   //遞歸調用
        t2 = Fibonacci(n-2);
        return t1 + t2;
    }
}

遞歸算法思想

遞歸算法即在程序中不反復調用自身達到解決問題的方法,是一個方法在其方法體內調用自身方法調用方式。在遞歸中主方法又是被調方法。執行遞歸將反復調用其自身。每調用一層就進入新的一層。 
遞歸調用分為兩種情況:

  • 直接遞歸,即在方法中調用方法本身
  • 間接遞歸,即間接地調用一個方法 
    編寫遞歸方法時,必須使用if語句強制在未執行遞歸前返回。

遞歸算法實例

遞歸算法常用於有明顯遞推性質的問題和一些數學問題。 
問題:求階乘 
n!=n*(n-1)(n-2)(n-3)………*2*1 
(n-1)!=(n-1)(n-2)(n-3)………*2*1 
得到遞推公式: 
n! =n*(n-1)!

算法實現

long fact(int n)
{
    if(n<=1)
    return 1;
    else
    return n*fact(n-1);
}

分治算法思想

分治算法基本思想

分治算法就是把一個復雜問題分為規模較小的,計算簡單的小問題,然后綜合小問題得到最后答案的思想。分治算法執行過程如下:

  1. 對於一個規模為N的問題,若給問題比較容易解決,則直接解決;否則執行下面的步驟。
  2. 將該問題分解為M個規模較小的問題,這些問題相互獨立,並且與原問題相互獨立。
  3. 遞歸這些小問題
  4. 然后,將各個小問題合並得到完問題的解

分治算法實例

題目:一個袋子里有三十個硬幣,其中有一枚假幣,並且假幣和真幣一某一樣,肉眼很難分辨,目前只知道假幣比真幣輕一點,請問如何區分假幣?

算法分析

  1. 首先為每個硬幣編號,然后然后將所有硬幣等分為兩份,放在天平兩邊。
  2. 再將較輕的那一份等分為兩份重復上述方法
  3. 直到剩下兩個硬幣,較輕的一個就是假幣

算法實現

int FalseCoin(int coin[],int low,int high)
{
    int i,sum1,sum2,sum3;
    int re = 0;
    sum1 = sum2 = sum3 = 0;
    if(low+1==high)
    {
        if(coin[low]<coin[high])
        {
            re = low + 1;
            return re;
        }
        else 
        {
            re = high +1;
            return re;
        }
    }
    if((high-low+1)%2==0)   //n是偶數
    {
        for(i=low;i<=low+(high-low)/2;i++)
        {
            sum1= sum1+coin[i];
        }
        for(i=low+low+(high-low)/2;i<=high;i++)
        {
            sum2= sum2+coin[i];
        }
        if(sum1>sum2)
        {
            re=FalseCoin(coin,low+(high-low)/2,high);
            return re;
        }
        else if(sum1<sum2)
        {
            re=FalseCoin(coin,low,low+(high-low)/2);
            return re;
        }
    }
    else
    {
        for(i=low;i<=low+(high-low)/2-1;i++)
        {
            sum1= sum1+coin[i];
        }
        for(i=low+low+(high-low)/2+1;i<=high;i++)
        {
            sum2= sum2+coin[i];
        }
        sum3=coin[low+(high-low)/2];
        if(sum1>sum2)
        {
            re=FalseCoin(coin,low+(high-low)/2+1,high);
            return re;
        }
        else if(sum1<sum2)
        {       
            re=FalseCoin(coin,low,low+(high-low)/2-1);
            return re;
        }
        else
        {
            re=low+(high-low)/2+1;
            return re;
        }
    }
    return re;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM