抵消树

时间:2015-01-01 20:12:56

标签: javascript algorithm dom data-structures

所以我的数据结构如下:

{
  "text": "hello world!",
  "tags": [{"start": 0, "end": 4, "tag": "b"}, {"start": 1, "end": 5, "tag": "i"}]
}

我想把它变成这样的东西:

[["b", [
   ["#text", "h"],
   ["i", ["#text", "ello"]]]]
,["i", ["#text", " "]]
,["#text", "world!"]]

(是的,这是一种抽象的表示它看起来像DOM树的样子。)

我不确定甚至开始接近这个的正确方法是什么。 。 。任何想法?

1 个答案:

答案 0 :(得分:0)

添加新标签的方法也许可以通过类似于深度优先搜索的过程来完成。最初,数据结构只是一个叶子节点:

[
    ["#text", "hello world!"]
]

添加第一个标记会将目前唯一的节点拆分为两个节点,其中一个节点标记为" b"。实际上,正在添加一个新元素,并且唯一节点的字符串将被创建为它的子字符串:

[
    ["b",
        ["#text", "hello"]
    ],
    ["#text", " world!"]
]

对流程进行推广,叶节点包含原始文本的子串,非叶节点是标签。添加另一个标签时,执行深度优先搜索,同时还保持到目前为止看到的子串长度之和

当搜索进入" b"在上面的结构中,子串和长度为0.在添加该节点的长度之后(" hello"),子串长度将变为5.因为" i& #34;重叠0 - 5" b"必须暂时拆分节点,生成:

[
    ["b",
        ["#text", "h"],
        ["i",
            ["#text", "ello"]
        ]
    ],
    ["#text", " world!"]
]

然而,对于" i"标签,下一个节点(标有" #text")仍然必须拆分。进入该节点后,当前子字符串长度为5,并且在添加该节点的文本后将变为12(" world!")。 " I"在5 - 12的范围内,这是分割节点产生的条件:

[
    ["b",
        ["#text", "h"],
        ["i",
            ["#text", "ello"]
        ]
    ],
    ["i",
        ["#text", " "]
    ],
    ["#text", "world!"]
]

请注意,括号与您在问题中发布的内容略有不同。我认为原始括号问题(在评论中提到)不是最后一个括号