Gap buffer -- 一个数据结构为可编辑的文本
2018-02-04 20:29
1266 查看
介绍
如果我们想要实现一个文件编辑器,可以高效的支持文本的插入和删除。首先我们不得不解决一个问题,就是文件编辑器中的文本如何存放。使用数组、链表还是别的数据结构。本文从原始数组开始,介绍Gap Buffer存放文本数据的高效实现。文本编辑器原始的数组实现
如果我们把文件编辑器的文本存放到一个char类型的数组中。如下面的文本:char[] buffer = ['h','e','l','l','o'];
我们现在想要在文本的第一位插入一个字符,‘h’。我们不得不移动整个数组,这大概需要O(n)的时间。如果我们把’h’字符删除掉,我们也不得不移动整个数组,这大概也需要O(n)的时间。
Gap Buffer
Gap buffer是一个动态数组允许高效的插入和删除。Gap buffer通常应用于文本编辑器软件,因为在文本编辑器软件里大部分插入和删除操作通常发生在相同的光标位置。Gap buffer是一个字符数组和空格(空格代表gap)
char [] gapBuffer = ['h', 'l', 'l', '', '', '', '', '', ''];
gap的开始位置为gap的第一个位置。gap的结束位置为gap的下一个元素。
插入
现在这个文本编辑器粒存放的文本是”hll”,后面的空格是gap。当用户发现拼写错误是。正确的应该是”hell”。我们需要在h后面添加一个新的字母e。我们需要移动gap到插入位置,移动后的文本如下:
char [] gapBuffer = ['h', '', '', '', '', '', '', 'l', 'l'];
然后我们插入字母e,并减小gap的size
char [] gapBuffer = ['h', 'e', '', '', '', '', '', 'l', 'l'];
之后,我们可以在光标位置插入更多的字符,在常数时间内可以完成O(1)。
删除字符
删除字符同添加字符类似,我们需要移动gap到删除位置,并增加gap的size。我们并不需要改变被删除字符的值,只需要移动gap到删除位置,并增加gap的size。
扩展gap
随着文本的插入,gap会被完全填充满。此时我们需要对gap进行扩展。扩展比较耗时,需要O(n)的时间。但是,在实践中,发生扩展的概率是比较小的。结论
Gap buffer非常适用于哪些比较小的文本编辑软件,并且编辑的文本内容不是太大。Emacs 的实现就是使用的Gap buffer。
相关文章推荐
- 记录百度富文本编辑框 UEditor 的一个问题
- PyQt4 菜单栏 + 工具栏 + 状态栏 + 中心部件 生成一个文本编辑部件示例
- PMEdit一个富文本框可以编辑文本、并可以显示GIF动画
- linux终端下用vi命令创建一个文件(a),创建进入文本编辑界面命令?
- js在一个可编辑的div光标处插入图片或者文本(兼容ie,火狐等浏览器)
- 编辑距离、拼写检查与度量空间:一个有趣的数据结构BK Tree
- 发现SynEdit是一个很好的东东,功能强大的通用文本编辑控件。
- Notepad2 V4.1.24.62 免费版 是一个外观类似系统记事本的文本编辑工具
- 编辑距离、拼写检查与度量空间:一个有趣的数据结构 BK-Tree
- opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类
- 发现SynEdit是一个很好的东东,功能强大的通用文本编辑控件。
- WORD2007只可以打开一个文档,且打开后文本有时出现不可 编辑情况
- 编辑距离、拼写检查与度量空间:一个有趣的数据结构
- 基于EditText实现一个可以对编辑文本进行撤销与返回的文本编辑器
- 编辑距离、拼写检查与度量空间:一个有趣的数据结构(转)
- 编辑距离、拼写检查与度量空间:一个有趣的数据结构
- 使用Swing组件编写一个支持中文文本编辑程序ChineseTextEdit.java
- FCKeditor 一个开源的web页面文本编辑工具,在vs 2005中的使用方法
- 每次用UltraEditor编辑文本都会生成一个.txt.bak文件,好烦人的,怎么才能让它不生成呢。
- 一个共通的viewModel搞定所有的编辑页面