我正在使用C ++实现完全抽象对象的Rope数据结构。我遇到的问题是我无法弄清楚关键“拆分”操作的实现。维基百科页面很有用,但模糊且高度理论化,附在文本上的图像无助于我对算法的理解。是否有良好的实现,或提供示例代码的论文?我曾尝试阅读原始论文,但他们也没有真正帮助。
答案 0 :(得分:4)
假设我们有一个类似
的绳索结构struct Rope {
Rope *left;
union {
Rope *right;
const char *string;
};
size_t length;
};
如果left
为空,则字符为string[0], ..., string[length - 1]
。否则,字符是left
中的字符,后跟right
中的字符。暂且不谈存储管理的问题,子字符串操作是
Rope *substring(const Rope *r, size_t start, size_t length) {
if (!r->left) {
Rope *s = new Rope;
s->left = 0;
s->string = r->string + start;
s->length = length;
return s;
} else if (start + length <= r->left->length) {
return substring(r->left, start, length);
} else if (r->left->length <= start) {
return substring(r->right, start - r->left->length, length - r->left->length);
} else {
Rope *s = new Rope;
s->left = substring(r->left, start, r->left->length - start);
s->right = substring(r->right, 0, length - (r->left->length - start));
s->length = length;
return s;
}
}