我正在寻找一种算法,将任何有限大的有限长字符串集转换为-1到1之间的特定实数,其中每个字符串都有唯一的实数表示。 这个问题与编程语言无关。
其中每个字符串可以包含许多单词和结束行,以及通过数学定义的实数。我也可以使用任意精度库。
答案 0 :(得分:8)
假设您希望每个字符串映射到唯一的实数,也可以将其解码回原始字符串,我会使用arithmetic coding。
基本上,您要做的是将-1到1之间的实数组划分为等于字母表中{0}字符数的部分。要编码单个字符串,只需选择其中一个区域的开头即可。要对字符串的第二个字符进行编码,首先要找到第一个字符所在的区域,然后将该区域细分为n
个较小的区域,然后选择第二个字符所在的区域。然后,您可以对此解决方案进行递归,以便能够将任意长度的字符串转换为唯一的实数。
例如,假设我们的字母表只包含字符n
和a
,我们希望对字符串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。