一个压缩算法 可以适当的用来编码
2013-12-07 16:38
176 查看
function encode($string) { $dict = array_flip(range("\0", "\xFF")); $dict_size = 256; $word = $string[0]; $dict_count = 256; $bits = 8; $bits_max = 256; $return = ""; $rest = 0; $rest_length = 0; for ($i = 1, $j = strlen($string); $i < $j; $i++) { $x = $string[$i]; $y = $word . $x; if (isset($dict[$y])) { $word .= $x; } else { $rest = ($rest << $bits) + $dict[$word]; $rest_length += $bits; $dict_count++; if ($dict_count > $bits_max) { $bits_max = 1 << ++$bits; } while ($rest_length > 7) { $rest_length -= 8; $return .= chr($rest >> $rest_length); $rest &= (1 << $rest_length) - 1; } $dict[$y] = $dict_size++; $word = $x; } } $rest = ($rest << $bits) + $dict[$word]; $rest_length += $bits; $dict_count++; if ($dict_count > $bits_max) { $bits_max = 1 << ++$bits; } while ($rest_length > 0) { if($rest_length>7){ $rest_length -= 8; $return .= chr($rest >> $rest_length); $rest &= (1 << $rest_length) - 1; }else{ $return .= chr($rest << (8 - $rest_length)); $rest_length = 0; } } return $return; } function decode($binary) { $rest = 0; $rest_length = 0; $out_count = 257; $bits = 9; $bits_max = 512; $dict = range("\0", "\xFF"); $w = $binary[0]; $return = $w; for ($i = 1, $j = strlen($binary); $i < $j; $i++) { $rest = ($rest << 8) + ord($binary[$i]); $rest_length += 8; if ($rest_length >= $bits) { $rest_length -= $bits; $e = $dict[$rest >> $rest_length]; if (!isset($e)) { $e = $w . $w[0]; } $return .= $e; $dict[] = $w . $e[0]; $w = $e; $rest &= (1 << $rest_length) - 1; if (++$out_count > $bits_max) { $bits_max = 1 << ++$bits; } } } return $return; } echo decode(encode(file_get_contents('http://www.baidu.com')));
相关文章推荐
- 实现了一个压缩算法,在数据高度压缩的前提下,还可以快速查找 key
- 实现了一个压缩算法,在数据高度压缩的前提下,还可以快速查找 key
- 龙腾世纪:起源(推荐一个可以用来英语学习的RPG游戏)
- 今天发现一个文本压缩的好算法
- 一个建议的tcp服务器,可以用来做防火墙端口测试调试
- 公司项目上的一个需求,说不上来叫什么名字,不过可以用来做一个图片展示。
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- (原创)一个JavaScript Function Outliner插件 第四版本 支持内嵌javascript,且可以对javascript进行压缩
- 实现简易字符串压缩算法:一个长度最大为128的字符串, 由字母a-z或者A-Z组成,将其中连续出现2次以上(含2次)的字母转换为字母和出现次数,以达到压缩目的
- 同一个 DatagramPacket 对象可以被重用,用来多次发送或接收数据
- js函数写法一个需要注意的问题(如果不需要做js压缩优化则可以不用注意)
- 为大家共享一个FireFox插件,可以用来访问wiikii百科
- (原创)一个JavaScript Function Outliner插件 第四版本 支持内嵌javascript,且可以对javascript进行压缩
- 一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。 例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3 你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得
- 【算法题】题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。 求总共有多少总跳法,并分析算法的时间复杂度
- 一个可以用来站内检索的简单爬虫
- 每天学习一算法系列(25)(一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。)
- 一个在线音乐软件的故事(四、现在就可以开始编码了吗?)
- Huffman 编码压缩算法
- 模板方法模式(Template Method)-定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。