Java Burrows Wheeler向前移动

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];

对于我正在进行的一个项目,我需要在O(n)空间中实现Burrows-Wheeler的MoveToFront变换。不过,出于某种原因,我的代码可以处理我抛出的大多数值,但不是全部

我的实现如下所示:

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方法——简单的位移位通常会出错,因为我们处理的是有符号值……这是我的经验