Java Burrows Wheeler向前移动
对于我正在进行的一个项目,我需要在O(n)空间中实现Burrows-Wheeler的MoveToFront变换。不过,出于某种原因,我的代码可以处理我抛出的大多数值,但不是全部 我的实现如下所示:Java Burrows Wheeler向前移动,java,compression,huffman-code,Java,Compression,Huffman Code,对于我正在进行的一个项目,我需要在O(n)空间中实现Burrows-Wheeler的MoveToFront变换。不过,出于某种原因,我的代码可以处理我抛出的大多数值,但不是全部 我的实现如下所示: public byte[] transform (byte[] input) { if (input.length == 0) return input; IndexedByte[] bytes = new IndexedByte[input.length];
public byte[] transform (byte[] input)
{
if (input.length == 0)
return input;
IndexedByte[] bytes = new IndexedByte[input.length];
for (int i = 0; i < input.length; i++)
{
bytes[i] = new IndexedByte(input[i],i);
}
for (int i = 0; i < input.length -1; i++)
{
bytes[i].next = bytes[i+1];
}
bytes[input.length - 1].next = bytes[0];
Arrays.sort(bytes);
byte[] newBytes = new byte[input.length];
for (int i = 0; i < bytes.length; i++)
newBytes[i] = bytes[i].b;
int[] indexes = new int[input.length];
for (int i = 0; i < indexes.length; i++)
indexes[i] = (bytes[i].origIndex + (input.length - 1)) % input.length;
int x = 0;
String str = new String(input);
for (int i = 0; i < input.length; i++)
{
if (bytes[i].origIndex == 0)
{
x = i;
break;
}
}
byte[] header = intToByteArray(x);
byte[] result = new byte[indexes.length+header.length];
for (int i = 0; i < header.length; i++)
result[i] = header[i];
for (int i = 0; i < indexes.length; i++)
result[i+header.length] = input[indexes[i]];
return result;
}
公共字节[]转换(字节[]输入)
{
if(input.length==0)
返回输入;
IndexedByte[]字节=新的IndexedByte[input.length];
for(int i=0;i
对我在这里做错了什么有什么建议吗?当遇到非字母数字字符时,这似乎不起作用(即编码本身,似乎/*等会把它搞糟)。对这段代码运行各种测试后,它似乎工作正常。您看到的问题可能是由于
byteArrayToInt
实现中的符号扩展造成的。例如,以下代码打印的是-128
,而不是预期的128
:
System.out.println(byteArrayToInt(intToByteArray(128)));
尝试将代码更改为:
private int byteArrayToInt(byte[] b) {
return (b[0] << 24) +
((b[1] & 0xFF) << 16) +
((b[2] & 0xFF) << 8) +
(b[3] & 0xFF);
}
private int byteArrayToInt(字节[]b){
return(b[0]在此代码上运行各种测试后,它看起来工作正常。您看到的问题可能是由于byteArrayToInt
实现中的签名扩展。例如,以下代码打印的是-128
,而不是预期的128
:
System.out.println(byteArrayToInt(intToByteArray(128)));
尝试将代码更改为:
private int byteArrayToInt(byte[] b) {
return (b[0] << 24) +
((b[1] & 0xFF) << 16) +
((b[2] & 0xFF) << 8) +
(b[3] & 0xFF);
}
private int byteArrayToInt(字节[]b){
返回(b[0]行String str=new String(input);
是不必要的,但不太可能是您的问题。您可能希望包含IntToByteArrayHoops的代码,抱歉:当遇到非字母数字字符时,这似乎不起作用(即编码本身,似乎/*等会使其出错).只需再次检查(或显示)inToByteArray方法-简单的位移位通常会出错,因为我们处理的是有符号的值…只是我的经验行String str=new String(input);
是不必要的,但不太可能是您的问题。您可能希望包含IntToByteArrayHoops的代码,抱歉:当遇到非字母数字字符时,这似乎不起作用(即编码本身,似乎/*等会把它搞糟)。只需再次检查(或显示)inToByteArray方法——简单的位移位通常会出错,因为我们处理的是有符号值……这是我的经验