1

对于我正在进行的项目,我需要在 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;
}

关于我在这里做错了什么有什么建议吗?当遇到非字母数字字符时,这似乎不起作用(即编码本身,似乎 /* 等会搞砸)。

4

1 回答 1

1

在对此代码运行各种测试后,它看起来好像可以正常工作。您看到的问题可能是由于实现中的符号扩展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);
}

顺便说一句,永远不会达到MAXIMUM = 50000内部的极限。IndexedByte.compareTo我得到一个java.lang.StackOverflowError长度为 5214 的输入数组。我建议将其更改为迭代而不是递归(这应该相当容易,因为您知道输入数组的长度,并且它还可以防止在病理情况下出现多余的循环,其中输入数组中的所有字节都相等)。

于 2009-07-30T16:00:23.037 回答