1

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

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

4

3 回答 3

8

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

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

例如,假设我们的字母表只有字符ab并且我们想要对字符串进行编码aba。第一个a给了我们 region [-1,0),第二个字符然后细分了这个 region 并产生了[-0.5,0)。对最终区域重复a以产生区域[-0.5,-0.75)。该区域中的任何数字都只能解码为序列aba(假设我们知道原始字符串的长度,或者我们可以在解码时永远递归)。

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

于 2013-01-02T00:47:13.037 回答
6

[将我的评论变成答案。]

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

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

由于没有算法,所以没有额外的内存需求;您的输入字符串也是您的输出!任意精度库等没有问题。

于 2013-01-02T01:07:00.887 回答
2

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

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

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

于 2013-01-02T00:44:42.503 回答