簡體   English   中英

整數除法算法分析

[英]Integer Division Algorithm Analysis

對於賦值,我們需要編寫除法算法,以便僅使用加法和遞歸來完成某個問題。 我發現,在不使用尾遞歸的情況下,天真的重復減法實現很容易導致堆棧溢出。 所以快速分析這個方法,如果我錯了就糾正我,這表明如果你將A除以B,分別用n和m二進制數,它應該是以nm為指數。 我真的得到了

O( (n-m)*2^(n-m) ) 

因為你需要從n個二進制數字2 ^(nm)次中減去一個m二進制數字,以便將n位數字刪除到n-1位數字,你需要這樣做nm次來得到一個數字在重復減法除法中最多有m個數字,因此運行時應該如上所述。 再說一次,我很可能是錯的,所以有人請你糾正我,如果我。 這是假設O(1)加法,因為我正在使用固定大小的整數。 我想用固定大小的整數可以說算法是O(1)。

回到我的主要問題。 我開發了一種不同的方法來執行整數除法,即使在遞歸使用它時,它也可以更好地工作,基於for的想法

P = 2^(k_i) + ... 2^(K_0)

我們有

A/B = (A - B*P)/B + P

該算法如下計算A/B

input:
    A, B

    i) Set Q = 0

   ii) Find the largest K such that B * 2^K <= A < B * 2(K + 1)

  iii) Q -> Q + 2^K

   iv) A -> A - B * 2^k

    v) Repeat steps ii) through iv) until A <= B

   vi) Return Q  (and A if you want the remainder)

由於僅使用加法的限制,我只是在每次遞歸調用時將B添加到自身,但是這里是我的代碼沒有遞歸並且使用移位而不是添加。

int div( unsigned int m, unsigned int n )
{
    // q is a temporary n, sum is the quotient
    unsigned int q, sum = 0;
    int i;

    while( m > n )
    {
         i = 0;
         q = n;

         // double q until it's larger than m and record the exponent
         while( q <= m )
         {
              q <<= 1;
              ++i;
         }

         i--;
         q >>= 1;         // q is one factor of 2 too large
         sum += (1<<i);   // add one bit of the quotient
         m -= q;          // new numerator
    }

    return sum;
}

我覺得sum |= (1<<i)可能更合適,以強調我正在處理二進制表示,但它似乎沒有給任何性能提升並且可能使它更難理解。 因此,如果MN分別是mn的位數,則分析表明內循環執行M - N次,每次外循環完成m失去一位,並且它也必須完成M - N為了條件m <= nM - N次,所以我得到它是O((M - N)^ 2)。

畢竟,我問我是否對算法的運行時間是否正確以及是否可以對其進行改進?

您的算法非常好,您對運行時間的分析是正確的,但您不需要每次都執行內部循環:

unsigned div(unsigned num, unsigned den)
{
    //TODO check for divide by zero
    unsigned place=1;
    unsigned ret=0;
    while((num>>1) >= den) //overflow-safe check
    {
        place<<=1;
        den<<=1;
    }
    for( ;place>0; place>>=1,den>>=1)
    {
       if (num>=den)
       {
           num-=den;
           ret+=place;
       }
    }
    return ret;
}

這使它成為O(MN)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM