[转]行程编码

[url]http://chengkehan.wordpress.com/2011/01/16/%E8%A1%8C%E7%A8%8B%E7%BC%96%E7%A0%81%EF%BC%88run-length-encoding%EF%BC%89/[/url]

行程编码应该算是简单的一种压缩技术了。这种的算法非常明了,比如我有一个字符串“AAAABBBBCCCCDDDD”,如果以最简单的ASCII编码形式保存的话,就需要16个字节,那么如果使用了行程编码呢,编码后将会像是这样,“#A4#B4#C4#D4”,就是12个字节,如果重复char越多效果就越明显了。注意这里我们使用的是ASCII编码的演示,所以“#A4”是三个字节,“#A255”同样是三个字节。压缩后的“#A4#B4#C4#D4”是什么意思呢,在这里“#”是一个标记(一般叫做哨兵),表示在这个后边的字符是被编码过的,当然这里选择“#”只是一个演示,具体的你需要更具情况来选择一个,在被编码的文本中很少出现的字符,这样压缩的效果就会更好(原因后面会说)。那么接下去的“A4”就表示“A”这个字符重复四次,以此类推。

这里有一个要注意个问题,万一我选择的哨兵和被压缩的文本中的字符一样了该怎么办呢,因为我们有时很难保证哨兵一定不会和文本中的字符相同。比如哨兵是“#”压缩的文本是“###”,那么输出的结果应该是“##3”,第一个“#”是哨兵,第二个“#”是重复的字符。

再看上面的例子,其实压缩效果不是那么好,“AAAA”(四个字节)被压缩成了“#A4”(三个字节),那如果是“AAA”(三个字节呢),那么输出的就是“#A3”(还是三个字节),根本没有压缩,所以只有当出现3个以上重复字符时执行该算法才是有效果的,小于三个反而会增加字节数,当然重复字符越多效果就越明显。

好,问题又来了,现在对哨兵是“#”压缩的文本是“###”进行处理,很明显,要压缩的文本不足三个字符,难道就不进行压缩了吗,如果看到小于三个重复的就不压缩,那么我们怎么判断这里的“#”是哨兵还是文本中的字符呢。所以如果文本中有和哨兵相同的字符,那么就不能按照上面说的“三个以上重复的执行算法”来做。这也就是为什么在选择哨兵字符是要做特别注意的原因了,最好哨兵字符不要再文本中出现,因为如果哨兵不是重复多次的切出现的很多,那么压缩的效果将大打折扣了

下面是一个对ASCII进行行程编码的源码

http://www.rayfile.com/zh-cn/files/19cd1e1c-1efc-11e0-97bb-0015c55db73d/
由于是对针对ASCII编码文本的操作,所以一个字符如果重复超过超过255次,那么将从第256次重新开始计数。所以不会出现像这样的“#A256”,而应该是“#A255A”。如果你想把它应用于更广的字符范围可以改成双字节的unicode。

你可能感兴趣的:(算法技术,算法,WordPress)