算法設計與分析——習題一


習題1

 

1.1. 用於計算gcd(m,n)的歐幾里得算法

 

1.1.1. 算法描述

 輾轉相除法,又名歐幾里得算法(Euclidean algorithm),是求最大公約數(greater common divisor)的一種,通常做法是:用較小的數去除較大的數,用第二余數再去除第一余數,最終我們可以得到最終的余數為0以及最大公約數。

 

1.1.2.偽代碼

Euclid(m,n)

//使用Euclid計算gcd(m,n)

//輸入:兩個不全為0的非負整數m,n

//輸出:m,n的最大公約數

while n≠0 do

  r ← m mod n

  m← n

  n ← r

return m

 

 

1.1.3.算法實現

int Euclid(int m,int n){

    int r;

    while(n!=0){

        r=m%n;

        m=n;

        n=r;

    }

    return m;

}

 

 

1.2. 用於計算gcd(m,n)的枚舉算法

 

1.2.1.算法描述

枚舉算法,是求最大公約數的一種,通常做法是:從1到自己本身進行遍歷,如果說能夠被整除,那么將這個數進行返回。

 

1.2.2.偽代碼

 enumeration(m,n)

//使用 enumeration計算gcd(m,n)

//輸入:兩個不全為0的非負整數m,n

//輸出:m,n的最大公約數

for i 1 to n by incr 1 do

  if ((n mod i == 0) and (m mod i == 0) ) then

ans = n

     end if

return ans

 

 

1.2.3.算法實現

int  enumeration(int m,int n){

    int res=1;

    for(int i=1;i<=n;i++)

        if(m%i==0&&n%i==0) res=i;

    return res;

}

 

 

1.3. 實現Eratosthenes篩選法

 

1.3.1.算法描述

埃拉托色尼篩選法(sieve of Eratosthenes) ,是用來篩選素數(Prime)的一種方法,通常做法是:新建一個布爾類型的數組,從1到該數字的平方根(root)進行遍歷,將自己本身的倍數變為1,那么,剩余為0的數字將是素數

 

1.3.2.偽代碼

Eratos(n)

//使用sieve of Eratosthenes打印素數表

//輸入:給定數字的最大區間

//輸出:小於該數字的自然數的所有素數(從小到大)

np[n+1]

for i 1 to n+1 incr 1 do

while i*j<=n do

Np[i*j]=1

for i 2 to n+1 incr 1 do

if np[i]==0 then

print i

end if

 

1.3.3.算法實現

void Eratos(int n){

    int np[n+1]={0};

    for(int i=2;i*i<=n;i++)

        for(int j=2;j*i<=n;j++)

            np[j*i]=1;

    for(int i=2;i<n+1;i++)

        if(np[i]==0) cout<<i<<" ";

}

 

 

1.4. 試驗小結

 

算法

時間復雜度

空間復雜度

歐幾里得算法

O(logn)

O(1)

枚舉算法

O(n)

O(1)

埃拉托色尼篩選法

O(nlogn)

O(1)

1-1

關於三種算法,時間空間復雜度分析如上表1-1,算法課第一節課我們學習了歐幾里得和枚舉兩種可計算gcd的算法,然而,我們歐幾里得算法仍然可以簡化代碼,簡化為遞歸進行求解gcd,這樣實現,時間復雜度並不會提高,而空間復雜度會提高。埃氏篩法和傳統素數求解不一樣,傳統素數求解需要O(n^2)的時間復雜度,這種篩法大大提高了求解素數的效率。

 


免責聲明!

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



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