Для проекта, над которым я работаю, мне нужно реализовать преобразование Берроуза-Уилера MoveToFront в пространстве O(n). Однако по какой-то причине мой код работает с большинством значений, которые я ему подбрасываю, но не со всеми.
Моя реализация выглядит примерно так:
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;
}
Любые советы о том, что я делаю неправильно здесь? Кажется, что это не работает, когда встречается небуквенно-цифровой символ (т.е. само кодирование, кажется, что /* и т. д. испортят его).
String str = new String(input);не нужна, но вряд ли она будет вашей проблемой. - person Matthew Murdoch   schedule 30.07.2009newBytesтакже кажется ненужным (к нему не обращаются после заполнения). - person Matthew Murdoch   schedule 30.07.2009