这个算法/例程的名字是什么?
我正在编写一个将字符串从一个字母表转换为另一个字符串的实用程序类,在您希望使用目标字母表的情况下,这对于可用字符数量的限制很有用。 例如,如果你可以使用小写字母和数字,但只有12个字符的可能,从字母表压缩时间戳01234567989 -:
进入abcdefghijklmnopqrstuvwxyz01234567989
所以2010-10-29 13:14:00
有可能成为5hhyo9v8mk6avy
(19个charaters减少到16)。
该类设计为在字母之间来回转换,还计算可以安全存储在给定特定数量字符的目标字母表中的最长源字符串。
正在考虑通过谷歌代码发布,但是我显然希望其他人能够找到并使用它 - 因此这就是所谓的问题。 我不得不在两个独立的项目中使用这种方法,使用彭博和专有系统,当您需要生成特定长度的唯一文件名,但希望保留一些明文时,所以GUID不合适。
您的示例与具有固定目标和源词典的字典编码器有一些相似之处。 另外值得一提的是斐波那契编码,它有一个固定的目标字典(可变长度位),它是可变目标。
我认为这也取决于你的目标字母表是否有固定宽度的条目是非常重要的 - 如果你允许固定字母表和可变长度代码,你的压缩比将更接近你的熵! 如果预先知道源字母表分布,则可以容易地生成静态霍夫曼树。
这是一个简单的算法:
考虑你不必传输用于编码的字母表。 此外,您不使用(并传输)输入符号的概率,就像在标准压缩中一样,所以我们只是对数据进行重新编码。
在这种情况下,我们可以认为输入数据的数量是基数等于输入字母表的基数。 我们只需将其表示改为另一个基地,这是一项简单的任务。
EDITED示例:
输入alpabet: ABC
,输出字母表: 0123456789
消息ABAC
将在基数3中转化为0102
,即以10为基数的11(9 + 2)。
11
到基座10: 11
我们可能有一个解码问题,因为我们不知道在解码结果开始时有多少个0-es,所以我们必须使用其中一个修改:
1)以某种方式在流中编码压缩数据的大小。
2)在流的开始处使用虚拟1:这样我们的示例将变为:
10102
(基数3)= 81 + 9 + 2 = 92
(基数10)。
现在解码后我们只需要忽略第一个1
(这也提供了基本的错误检测)。
这种方法的主要问题是,在大多数情况下(GCD == 1),每个新的编码字符将完全改变输出。 这将非常困难并且难以实施。 我们最终将算术编码作为最佳解决方案(实际上是其简化版本)。
你可能知道Base64通常会以相反的方式做同样的事情。 太糟糕了,在BaseX或BaseN上有太多的Google结果...
链接地址: http://www.djcxy.com/p/3439.html