我在这里遇到了优化问题。我想让这段代码在 O(n) 中运行,我已经尝试了几个小时。
字节数组 c 包含一个字符串, e 包含相同的字符串,但已排序。整数数组 nc 和 ne 包含字符串中的索引,例如
c:
s l e e p i n g
nc:
0 0 0 1 0 0 0 0
e:
e e g i l n p s
ne:
0 1 0 0 0 0 0 0
现在的问题是 get_next_index 是线性的 - 有没有办法解决这个问题?
void decode_block(int p) {
BYTE xj = c[p];
int nxj = nc[p];
for (int i = 0; i < block_size; i++) {
result[i] = xj;
int q = get_next_index(xj, nxj, c, nc);
xj = e[q];
nxj = ne[q];
}
fwrite(result, sizeof (BYTE), block_size, stdout);
fflush(stdout);
}
int get_next_index(BYTE xj, int nxj, BYTE* c, int* nc) {
int i = 0;
while ( ( xj != c[i] ) || ( nxj != nc[i] ) ) {
i++;
}
return i;
}
这是Burrows-Wheeler实现的一部分
它开始于
xj = c[p]
nxj = nc[p]
接下来我必须 block_size (= 长度 c = 长度 nc = 长度 e = 长度 ne) 次
将结果 xj 存储在结果中
找到 c[i] == xj 的数字索引
xj 现在是 e[i]
ne 和 nc 仅用于确保 e 和 c 中的每个字符都是唯一的 (e_0 != e_1)。