我在掌握Burrows Wheeler转换(BWT)的解码算法方面遇到了困难。我已经在线阅读并查看了一些示例代码,但是,它们似乎都在使用“主索引”来解码编码的字符串。
我的问题是,如何将像'rdacraaaabb'这样的BWT编码字符串解码为原始的'abracadabra'。
一些示例代码会很精彩。
答案 0 :(得分:0)
答案 1 :(得分:0)
反向部分是算法中最简单的部分:创建累积直方图并根据其等级检索值。
您可以在此处找到基于BWT的完整块压缩器/解压缩器:http://code.google.com/p/kanzi/source/browse/java/src/kanzi/transform/BWT.java
答案 2 :(得分:0)
在我的代码中:abracadabra - > ardcraaaabb,key = 0
不是' rdacraaaabb'。
http://mlich.zam.slu.cz/js-bwt/js-cryptbwt.htm
http://mlich.zam.slu.cz/js-bwt/bwt_class.txt
- 但我的php解码很慢
- 这里必须为char \ n \ c \ r为textarea
function bwtDeCode(&$data)
{
arr = array();
$arr[0] = array();
$arr[1] = array();
$arr[2] = array();
$len = strlen($data['out']); // !!! input source data (string)
for ($i=0;$i<$len;$i++)
{
$arr[2][$i] = $i; //index row
$arr[1][$i] = $data['out'][$i]; //last col
$arr[0][$i] = $data['out'][$i]; //first col
}
usort($arr[0],array($this,'sortCmpDeCode')); //first col
// sort($arr[0]); //first col
$none = -1;
$i = $data['key'] * 1; // !!! input source key (number)
$key = $arr[1][$i];
$out = $key;
$arr[2][$i] = $none;
for ($j=1;$j<$len;$j++)
{
for ($i=0;$i<$len;$i++)
// foreach ($arr[0] as $i=>$value)
{
if ($arr[2][$i]===$none || $arr[0][$i]!==$key)
// if ($arr[0][$i]!==$key)
{continue;}
$key = $arr[1][$i];
// $out = $key . $out;
$out .= $key;
$arr[2][$i] = $none;
//unset($arr[1][$i]);
break;
}
}
$out = strrev($out);
$data['in'] = $out;
}