数字基本转换为流操作

时间:2009-05-19 19:23:32

标签: algorithm math complexity-theory

在常量工作空间中是否有办法执行任意大小和任意基本转换。也就是说,使用1对1映射将({1}}范围内的n个数字序列转换为范围[1,m]中的ceiling(n*log(m)/log(p))个数字序列( 最好但不一定)保留lexigraphical顺序并给出顺序结果?

我对作为管道功能可行的解决方案特别感兴趣,e.i。能够处理比存储在RAM中更大的数据集。

我发现许多解决方案需要“工作空间”与输入的大小成比例,但是没有一个可以通过不断的“工作空间”消失。


删除顺序约束会有什么不同吗?即:允许按字典顺序输入,以产生非字典顺序输出:

[1,p]

一些想法:

这可能有用吗?

  

streamBase n - &gt;转换(F(1,2,6,4,3,7,8) -> (5,6,3,2,1,3,5,2,4,3) F(1,2,6,4,3,7,9) -> (5,6,3,2,1,3,5,2,4,5) n) - &gt;转换(lcm(n,p)lcm(n,p)) - &gt; streamBase <子> P

(其中p是最不常见的倍数)

3 个答案:

答案 0 :(得分:6)

在一般情况下,我认为这是不可能的。如果mp的幂(反之亦然),或者如果它们都是共同基数的幂,则可以这样做,因为每组log {{1然后,m)是独立的。但是,在一般情况下,假设您要转换数字p a 1 a {{ 1}} 2 a 3 ... 。基数a中的等效数字是

{p> n p sum(a i * m in { {1}}

如果我们处理了第一个i-1数字,那么我们就会得到i部分和。要计算1..n)部分和,我们需要添加i i i+1 a 。在一般情况下,这个数字在大多数地方都有非零数字,所以我们需要修改到目前为止我们处理过的所有数字。换句话说,在我们知道最终输出数字是什么之前,我们必须处理输入数字的所有

i+1同时具有公共基数的幂的特殊情况下,或等效地,如果log * m i)是有理数,则m m 在前面附近的基座p中只会有一些非零数字,因此我们可以安全地输出我们计算出的大部分数字到目前为止。

答案 1 :(得分:2)

我认为有一种方法可以按照字典顺序以流为导向的方式进行基数转换。然而,我提出的并不足以实际做到这一点,它有几个假设:

  1. 位置编号的长度已知。
  2. 描述的数字是整数。我没有考虑过数学和-ive索引会发生什么。
  3. 我们有一系列值 a ,其长度为 p ,其中每个值都在[0, m -1]的范围内。我们想要在[0, n -1]范围内的长度 q 的值序列 b 。我们可以从 a 中计算输出序列 b k 数字,如下所示:

    b k = floor [sum(a i * m i for i in 0 to p-1)/ n k ] mod n

    让我们将这个总和重新排列成两部分,将它分成任意一点 z

    b k = floor [(sum(a i * m i for i in z to p-1)+ sum(a i * m i for i in 0 to z-1))/ n k ] mod n

    假设我们还不知道[0,z-1]之间的值,并且不能计算第二个和项。我们不得不处理范围。但是,这仍然为我们提供了有关 b k 的信息。

    最小值 b k 可以是:

    b k &gt; = floor [sum(a i * m i for i in z to p-1)/ n < sup> k ] mod n

    最大值 b k 可以是:

    b k &lt; = floor [(sum(a i * m i for i in z to p-1)+ m z - 1)/ n k ] mod n

    我们应该可以做这样的过程:

    1. z 初始化为 p 。当我们收到 a 的每个字符时,我们将从 p 倒计时。
    2. k 初始化为 b 中最重要值的索引。如果我的大脑仍在工作,请[ce n (m p )]。
    3. 读取 a 的值。减少 z
    4. 计算 b k
    5. 的最小值和最大值。
    6. 如果min和max相同,则输出 b k ,并递减k。转到4.(我们可能已经为 b k 的几个连续值提供了足够的值)
    7. 如果 z != 0,那么我们期望更多 a 的值。转到3。
    8. 希望,此时我们已经完成了。
    9. 我还没有考虑如何有效地计算范围值,但我有理由相信,从 a 的传入字符计算总和可以比存储所有字符更合理地完成of a 。虽然没有做数学,但我不会对此作出任何严厉的声明!

答案 2 :(得分:0)

是的,有可能

对于你读过的每个I字符,你都会写出O字符 基于Ceiling(长度* log(In)/ log(Out))。

分配足够的空间

Set x to 1
Loop over digits from end to beginning # Horner's method
    Set a to x * digit
    Set t to O - 1
    Loop while a > 0 and t >= 0
        Set a to a + out digit
        Set out digit at position t to a mod to base
    Set a to a / to base
Set x to x * from base
Return converted digit(s)

因此,对于16到2号基数(这很容易),使用&#34; 192FE&#34;我们读了&#39; 1&#39;并将其转换,然后在&#39; 9&#39;上重复,然后&#39; 2&#39;等等给我们&#39; 0001&#39; 1001&#39;,&#39; 0010&#39;,&#39; 1111&#39;,&#39; 1110&#39; 。 请注意,对于不是常用幂的基数,例如基数17到基数2,则意味着读取1个字符并写入5。