您的位置:首页 > 理论基础 > 数据结构算法

Rope --高效字符串处理数据结构

2018-02-04 19:54 731 查看

介绍

一个Rope 数据结构用来高效的处理字符串的拼接、查询、删除、及随机访问。Rope的一个典型应用场景是:在一个文本编辑程序里,用来保存较长的文本字符串。如下图,字符串“Hello_my_name_is_Simon”的表示



从上图可以看出,一个Rope 是一个二叉查找树,叶节点包含了的是字符串的子串。非页节点包含的是权重 = 左子树叶节点的所有字符和。一个字符串被分隔为两个部分,左子树包含了字符串的左边部分。右子树包含了字符串的右边部分。

操作API

index(i)

返回i位置的字符。时间复杂度O(logn)。我们通过递归的形式实现搜索。

伪代码实现:

function index(RopeNode node, integer i)
if node.weight <= i then
return index(node.right, i - node.weight)
end

if exists(node.left) then
return index(node.left, i)
end

return node.string[i]
end


例如:我们要搜索i = 10位置的字符。我们可以通过以下的方式进行搜索。



Concat ()

字符串链接API,链接两个Rope s1,s2 到单一的一个Rope s。

拼接时间复杂度O(1),计算root节点的weight的时间复杂度:O(logn)

两个Rope的链接操作是非常简单的,创建一个root节点,root.left = s1, root.right = s2。然后进行root节点weight的更新,时间大概是O(long)在平衡树的情况下。大部分实现中在concat后需要对树重新进行平衡。



split(s,i)

字符串分隔。分隔字符串s在i位置 为两个字符串s1和s2。s1= c1,,,,ci。s2 = ci+1,,,,cm。时间复杂度为O(logn)。

例如下面:分隔字符串在中间。



在字符串分隔后,树需要重新进行平衡。

Rope 的优势

Rope不需要连续的内存空间,不像数组

Rope在字符串中进行插入和删除更快O(logn)。而在字符串数组中需要O(n)。

在进行数据copy时。Rope不需要额外的O(n)内存空间。

Rope的缺点

需要更多的内存空间,需要维护父节点。

增加代码的复杂度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: