将任何字符串转换为-1到1之间的实数的算法

时间:2013-01-02 00:35:53

标签: algorithm encoding computer-science decoding

我正在寻找一种算法,将任何有限大的有限长字符串集转换为-1到1之间的特定实数,其中每个字符串都有唯一的实数表示。 这个问题与编程语言无关。

其中每个字符串可以包含许多单词和结束行,以及通过数学定义的实数。我也可以使用任意精度库。

3 个答案:

答案 0 :(得分:8)

假设您希望每个字符串映射到唯一的实数,也可以将其解码回原始字符串,我会使用arithmetic coding

基本上,您要做的是将-1到1之间的实数组划分为等于字母表中{0}字符数的部分。要编码单个字符串,只需选择其中一个区域的开头即可。要对字符串的第二个字符进行编码,首先要找到第一个字符所在的区域,然后将该区域细分为n个较小的区域,然后选择第二个字符所在的区域。然后,您可以对此解决方案进行递归,以便能够将任意长度的字符串转换为唯一的实数。

例如,假设我们的字母表只包含字符na,我们希望对字符串b进行编码。第一个aba为我们提供了区域a,第二个字符然后细分了该区域,并产生[-1,0)。重复最后的[-0.5,0)以产生区域a此区域中的任何号码只能 被解码为序列[-0.5,-0.75)(假设我们知道原始字符串的长度,或者我们可以直接递归解码)。

(有关编码和解码过程的详细说明,请参阅wikipedia。请注意,您可能只对此问题的等大小区域感兴趣。)

答案 1 :(得分:6)

[将我的评论转化为答案。]

你不需要做任何事情。字符串可以被视为实数。每个字符都是小数点后的一个数字,以256为基数(对于8位字符)。

As pointed out,无法区分具有多个尾随\0个字符的字符串。如果这是一个问题,那么你可以考虑这个数字base-257,并且没有字符映射到值0。

由于没有算法,因此没有额外的内存要求;你的输入字符串也是你的输出!任意精度库等都没有问题。

答案 2 :(得分:2)

假设一个字符串是20个ASCII字节,或160位。双精度实数只有64位。因此,每个可能的字符串都不能有唯一的实数。

另一方面,如果您不限于64位,只需将第一位后面的十进制(二进制)点,将第一位作为符号,并将该字符串的所有位作为分数。

实际上,如果将字母表限制为数字字符0-9,则它已经以十进制算术的形式存在,如COBOL和先前语言以及旧IBM计算机所支持。 只需将小数点放在前面,乘以2,然后减去1。