【发布时间】:2012-11-26 02:18:20
【问题描述】:
我在这里遇到了优化问题。我想让这段代码在 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)。
【问题讨论】:
-
你能再明确一点吗?您是要对未排序的数组进行排序,还是什么?
-
我添加了更多信息
-
嗯..在给定
e、ne和nc的情况下,这里的问题是恢复c吗? (示例数据似乎不可能。)或者在给定c和nc的情况下构造e和ne? (一点也不难,但是 O(N ln N)。) -
只给出了c,e是通过排序c构造的,ne和nc是通过对e和c的简单循环构造的
标签: c arrays sorting optimization