【问题标题】:Split operation on rope data structures对绳索数据结构的拆分操作
【发布时间】:2011-11-11 20:01:49
【问题描述】:

我正在为完全抽象的对象在 C++ 中实现 Rope 数据结构。我遇到的问题是我无法弄清楚关键“拆分”操作的实现。维基百科页面很有帮助,但含糊不清且理论性很强,并且附在文本中的图像无助于我对算法的理解。有没有好的实现,或者提供示例代码的论文?我已经尝试阅读原始论文,但它们也没有真正的帮助。

【问题讨论】:

    标签: c++ data-structures theory ropes


    【解决方案1】:

    假设我们有一个像这样的绳索结构

    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;
        }
    }
    

    【讨论】:

    • 非常感谢,这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2014-12-03
    相关资源
    最近更新 更多