Algorithm 转换为β-位整数到仅使用O(lgβ;)乘法和除法的数字数组 (编辑:我的问题已经被标记为一个副本,它已经链接到我原来的帖子中,甚至在标记之前,我认为它不足以回答我的特定问题,为什么没有得到任何未知函数的假设,如何得到一定的复杂性。)

Algorithm 转换为β-位整数到仅使用O(lgβ;)乘法和除法的数字数组 (编辑:我的问题已经被标记为一个副本,它已经链接到我原来的帖子中,甚至在标记之前,我认为它不足以回答我的特定问题,为什么没有得到任何未知函数的假设,如何得到一定的复杂性。),algorithm,binary,decimal,divide-and-conquer,base-conversion,Algorithm,Binary,Decimal,Divide And Conquer,Base Conversion,我正在尝试解决CLRS中的练习(Cormen算法简介,第3版)。演习内容如下: 给出一种将给定的β位(二进制)整数转换为十进制表示的有效算法。论证如果长度最多为β的整数的乘法或除法需要时间M(β),那么我们可以在时间Θ[M(β)lgβ]中将二进制转换为十进制。(提示:使用分而治之的方法,通过单独的递归获得结果的上半部分和下半部分) 有人问过这个问题,而且。然而,那里的答案要么做出错误的假设,比如M(β)=O(β),要么给出的答案完全忽略了问题的要求。另一个答案甚至明确指出了Θ[M(β)lgβ]的

我正在尝试解决CLRS中的练习(Cormen算法简介,第3版)。演习内容如下:

给出一种将给定的β位(二进制)整数转换为十进制表示的有效算法。论证如果长度最多为β的整数的乘法或除法需要时间M(β),那么我们可以在时间Θ[M(β)lgβ]中将二进制转换为十进制。(提示:使用分而治之的方法,通过单独的递归获得结果的上半部分和下半部分)

有人问过这个问题,而且。然而,那里的答案要么做出错误的假设,比如M(β)=O(β),要么给出的答案完全忽略了问题的要求。另一个答案甚至明确指出了Θ[M(β)lgβ]的结果,但解释相当简单,似乎结果是显而易见的:

但是,您可以在O(M(n)log(n))时间内进行基址转换,方法是选取目标基址的幂,该幂大致等于要转换的数字的平方根,用它进行除法和余数(可以通过牛顿方法在O(M(n))时间内完成),然后在两半上递归

这个解释对我来说并不完全清楚:如果不对M(n)做任何假设,这种递归将导致O(M(n)n)时间,而不是O(M(n)log(n))。(编辑:我的问题被标记为该线程的重复,但在标记为重复之前,我已经在我的原始帖子中包含了该线程的链接,因为我觉得该线程的答案没有充分解决我所困惑的问题)

据我所知,问题是每个乘法、商和余数运算都需要一个恒定的时间M,它支配着所有其他类型的运算,比如加法。因此,支配项M(β)lgβ仅来自于执行lgβ乘法和除法

然而,我不能想出任何只需要lgβ分割的东西。例如,如果我们从问题中得到提示,我们可以用伪代码提出以下分治算法

decimal(x, start, end, n):
    digits = end - start + 1 // assume power of 2
    if digits == 1:
        x[start] = n // 1-based index
    else:
        t = 10^(digits/2) // assume negligible time
        quotient, remainder = n / t // takes M time
        decimal(x, start, start+digits/2-1, quotient)
        decimal(x, start+digits/2, end, remainder)
对d位数字n调用
decimal(x,1,d,n)
,为简单起见,d的幂为2,将in的十进制表示形式放入size-d数组x中。假设行
商,余数=n/t
,占用时间M,并且在运行时主导其他一切,运行时递归是t(β)=2T(β/2)+M,其解是t(β)=Θ(βM),而不是Θ(Mlgβ)

我对这个问题的理解正确吗?如果是这样,如何仅使用Θ(lgβ)乘法和/或除法获得十进制表示

讨论这个问题。特别是:

二进制->基数:二进制->基数转换相同,但相反。以基数16中的N位数字X开始。您希望将其转换为基数b中的M位数字R。计算:高=地板(X/bM/2)。计算:低=X-bM/2*高。递归地转换低和高。附加结果。最终结果R将是转换为基数b的原始数字

然而,我仍然不明白这是怎样的O(lgb)乘法;如果你在两半上都递归,根据定义,你是在访问递归树中的每个节点,因此有O(B)乘法

Brent的《现代计算机算法》第55页,共239页,也讨论了“次二次算法”,并提到了M(β)lgβ分治算法。然而,我仍然不知道lgβ来自何方。同样,如果你分而治之,并且在两半上递归,那么运行时至少是线性的,而不是对数的!在该书第55页(共239页)中,提供了以下算法(略加解释):

算法1.26 FastIntegerOutput
输入:A=(0到n-1之和)A_i 2^i
输出:一个字符串S,表示一个基于in的10
如果A<10,则
返回字符(A)
其他的

求k,使其10^(2k-2)首先,让它不碍事:就我所知,我问题的标题所要求的,用对数数的除法和乘法进行转换是不可能的;这只是我基于对问题的误解而做出的假设

我与教科书的作者进行了通信,他们说,该算法确实调用除法Θ(β)次,而不是Θ(lgβ),在更深的递归层次上,M实际上作用于更小的参数,而不是像我在问题中错误假设的那样作用于常数、顶级β。特别是,树的顶层调用有M(β/2),下一层调用有2M(β/4),然后是4M(β/8),等等,总共有lgβ层。只要M(β)=Ω(β),树的总和就是O(M(β)lgβ,尽管通常不是Ω(M(β)lgβ),因此不是Θ(M(β)lgβ)。例如,对于多项式M(β)=Θ(β^α),对于α=1,树和是Θ(βlgβ)=Θ(M(β)lgβ),对于α>1,树和是Θ(β^α)=Θ(M(β))

因此,如果我们只假设M(β)=Ω(β),那么运行时将更准确地描述为O(M(β)lgβ),而不是像CLRS练习中那样的Θ(M(β)lgβ)。(在我与《现代计算机算术》的一位作者的通信中,他们认为CLRS意味着“给出一个有效的算法”,意味着假设M(β)是线性或拟线性的,但CLRS通常非常明确地说明了我们应该做出的假设,“给出一个有效的算法”这只是一个有点通用的短语,他们在文本中经常使用它来练习和解决问题,所以我觉得这可能是CLRS的一个小错误

更新:我提交了
Algorithm 1.26 FastIntegerOutput
Input: A = (sum 0 to n-1) a_i 2^i
Output: a string S of characters, representing A in based 10
    if A < 10 then
        return char(A)
    else
        find k such that 10^(2k-2) <= A < 10^(2k)
        (Q, R) = DivRem(A, 10^k)
        r = FastIntegerOutput(R)
        return concatenate(FastIntegerOutput(Q), zeros(k-len(r)), r)