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的缺点
需要更多的内存空间,需要维护父节点。增加代码的复杂度。
相关文章推荐
- 数据结构——字符串处理
- 树形结构数据后台处理:一次循环生成树
- java处理字符串搜索嵌套结构的方法
- sql server 2005处理数据挖掘结构出现错误
- 数据结构上机:字符串的加密解密
- VS2008下用C++ OLE技术高效处理Excel数据-总结
- [数据结构与算法]第一周(一):线性表---多项式加法&&字符串插入
- Hibernate处理一个实体映射多张相同结构的数据表--动态映射
- Facebook数据仓库揭秘:RCFile高效存储结构
- 字符串-英语数字转换器(数据结构基础 第4周)
- python---数据结构与数据类型,list,dict,tuple,排序sort,比较cmp,字符串模版
- 返回的数据中数组被双引号包裹成字符串的处理
- 基于流模式的字节byte缓存区 bytebuffer.cs 用于tcp/udp的网络数据高效处理
- 编程之美a题小数据 学习用sstream 处理字符串
- Java之美[从菜鸟到高手演变]之数据结构基础、线性表、栈和队列、数组和字符串
- libnids-1.21 中 IP 分片重组分析之数据结构与处理流程
- 海量数据处理常用数据结构及方法
- SpringMVC处理Ajax请求(请求数据为 json 格式字符串)
- Java 简单高效处理字符串-删除所有标点,正则表达式
- 数据结构——字符串和多维数组