gpt4 book ai didi

c - 整数除法算法分析

转载 作者:太空狗 更新时间:2023-10-29 16:11:07 25 4
gpt4 key购买 nike

对于一项作业,我们需要编写一个除法算法,以便仅使用加法和递归来完成某个问题。我发现,如果不使用尾递归,简单的重复减法实现很容易导致堆栈溢出。所以快速分析这个方法,如果我错了请纠正我,表明如果你将 A 除以 B,分别有 n 和 m 个二进制数字,它应该是 n-m 的指数。我真的明白了

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

因为您需要从 n 个二进制数字中减去 m 个二进制数字 2^(n-m) 次,以便将 n 数字减为 n-1 数字,并且您需要执行此 n-m 次以在重复的减法除法中得到一个最多m位的数字,所以运行时间应该如前所述。再一次,我很可能是错的,所以如果我错了,请有人纠正我。 这是假设 O(1) 加法,因为我使用的是固定大小的整数。我想对于固定大小的整数,有人可能会争辩说该算法是 O(1)。

回到我的主要问题。基于对于

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)为了强调我正在处理二进制表示可能更合适,但它似乎没有提供任何性能提升并且可能使其更难理解。所以,如果 MNm 中的位数和 n分别,分析表明执行了内部循环M - N次,每次外循环完成时 m松了一个位,也必须完成M - N次条件m <= 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(M-N)

关于c - 整数除法算法分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34457575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com