gpt4 book ai didi

java - 布罗斯-惠勒移到前面

转载 作者:太空宇宙 更新时间:2023-11-04 08:59:25 25 4
gpt4 key购买 nike

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

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

最佳答案

对此代码运行各种测试后,看起来它工作正常。您看到的问题可能是由于 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);
}

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

关于java - 布罗斯-惠勒移到前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1207334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com