2012-03-30 58 views
11

要求:算法生成字符串中唯一的(常量)代码应该是可逆

我们在DB值一样

Chennai 
Baroda 
Bangalore 
New Delhi 
São Paulo, Lisboa 
San Jose 

等等

所以我想将这些字符串转换为唯一的短字符串。例如,

Chennai –> xy67kr 

San Jose –> iuj73d 

基本上类似于URL缩写的东西。

而且算法,可将本应是可逆的,即..当我通过“xy67kr”的解码功能,应该给我回来“奈”。

期待着帮助。

+0

字符串是否需要具有固定长度? – 2012-03-30 08:21:41

+1

如果你有一个数据库,那么反转的处理应该很容易... – 2012-03-30 08:21:51

+0

1 - 字符串不是固定长度。最大长度= 200个字符 2 - 我想避免数据库调用。这就是我想要生成算法的原因。可以在DB中使用哪些字符串进行编码。相同的算法可以用于在我的web应用程序中解码并获得实际价值 – Taher 2012-03-30 08:22:48

回答

4

正如其他海报说,你不能有缩短任意字符串的函数,这就是数学上是不可能。但是你可以创建一个自定义的函数,它可以很好地适用于你的特定字符串。

一个例子的方法是计算该组中的字频,然后只用编码该字符的prefix code使得最频繁的字母与短前缀编码(即Huffman coding

上面的方法的确不利用自然语言中的下一个字符可以从以前的字符中很准确地预测的事实,因此您可以扩展上述算法,以便不用独立编码字符,而是使用n元语法编码下一个字符。这当然需要比简单方法更大的压缩表,因为根据前缀,您实际上有单独的代码。例如,如果'e'在'th'之后非常频繁,那么'th'之后的'e'用非常短的前缀编码。如果'e'在'ee'之后非常不频繁,那么在这种情况下它可以用非常长的前缀进行编码。解码算法显然需要查看当前解压缩的前缀以检查如何解码下一个字符。

这种一般方法假定频率不会改变,或者至少缓慢改变。如果数据集发生变化,则可能需要重新计算统计信息并对字符串进行重新编码。

+0

我怀疑这将适用于短输入数据。似乎OP也想要一种固定长度的编码,这显然是不可能的。 – 2012-03-30 13:21:05

+0

@OliCharlesworth相反,即使对于单字符字符串,这种统计编码也可以很好地工作,即使结果代码是6位,您仍然必须发送(或保存)至少一个字节。我同意定长编码是不可能的。 – 2012-03-30 13:48:40

+0

好吧,在我原来的问题中,我问我的输入字符串可以是可变长度的。因此,假设我通过应用填充使它们具有固定长度,即,使用填充,即 即 - >纽约[变成] - >纽约!@ !! @!或类似的东西。编码后可以缩短它们吗? – Taher 2012-04-02 06:10:45

4

my answer到类似的问题,只是它重写PHP:

编码:

$encoded = base64_encode(gzdeflate("São Paulo, Lisboa")) 

解码:

$decoded = gzinflate(base64_decode($encoded)) 

注意gzdeflate执行比gzcompress短串好。

但无论如何,这个问题是,对于短字符串它使串长。这对较长的文本表现更好。 这将是当然更好用一些压缩算法先验信息,如100ppm或后缀的方法与最初的后缀树......那就在短字符串很好地工作也。

+0

是的,我认为关键是这对OP没有帮助。 – 2012-03-30 09:36:44

+0

当然,使用一些具有先验信息的**压缩算法会更好,比如带有初始后缀树的ppm或后缀方法......然后它也可以在短字符串上完美工作。但问题是这些方法是否可以在PHP中访问。 – TMS 2012-03-30 10:07:25

+0

我正在使用C#,而不是PHP :) – Taher 2012-03-30 12:25:07

1

这不一定是确定性的,但显然你可以使用查找表。该服务将类似于goo.gl或imgur

相关问题