ここで最適化の問題が発生しています。このコードを 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 を result に格納する
c[i] == xj である数値インデックスを見つける
xj は e[i] になりました
ne と nc は、e と c のすべての文字が一意であることを確認するためにのみ使用されます (e_0 != e_1)。