我正在尝试将rope tree实现为字符串的替代数据结构。
维基百科页面不清楚拆分树的规则,但these rules似乎最初起作用。但是经过一些拆分操作后,我得到了一棵无效的树:
6
/\
/ \
4 \
/\ \
/ \ \
/ 2 4
/ /\ /\
4 2 3 4 7
A B C D E
数字表示节点的权重,以及叶子的子字符串长度。在这个格式错误的树中,永远无法访问子字符串C.
好树的例子。根据维基百科上的解释,每个角色都可以到达。
6
/\
/ \
/ 7
/ /\
4 3 \
/ \ / \ \
4 2 3 4 7
A B C D E
我没有CS背景,所以我不知道这棵树有什么问题。我甚至不知道如何正确地表达这棵树的问题。这棵树有什么问题(在CS术语中),我该如何解决?
答案 0 :(得分:2)
root违反了以下不变量:
每个节点的权重是其左子树中所有叶子权重的总和。
你的第二棵树通过改变结构来修复不变量,但这不是必需的。这是使用具有相同结构的不同权重的更正版本:
r: 9
/\
/ \
a: 4 \
/\ \
/ \ \
/ b: 2 4
/ /\ /\
4 2 3 4 7
A B C D E
要到达C
中的第一个字符(如果我们假设从1开始编制索引,则会在第7个位置),您将根据Wikipedia文章运行Index(r, 7)
。这是“日志”:
Index(a, 7)
Index(b, 3)
Index(C, 1)
C
附录:
请注意,维基百科文章提出以下(不同!)不变量:
每个节点的“权重”等于其字符串的长度加上其左子树中所有权重的总和。
这个表述与上面的图片不符:
根据上述不变量,图片中的节点B
必须具有15的权重。