编辑器数据结构

“Data Structures for Text Sequences”这篇文章给出了实现一个文本编辑器所需要的的数据结构和不同结构的效率。

文章指出有六种数据结构可以实现编辑器,分别是Linked List,Array,Gap,Line spans,Piece tables和Fixed size buffers。前三种结构为基本序列数据结构(Basic Sequence Data Structures),后三种数据结构为迭代序列数据结构(Recursive Sequence Data Structures),两者的区别在于,基本的数据结构将所有的文本内容统一存储在某种结构中,迭代序列数据结构将文本分块并存储,再通过某种算法将所有文本组合起来。

Linked List和Array显然不适合作为整个编辑器的数据结构,Linked List所占内存太大,Array在中间添加或者删除文本太过于缓慢。

Gap通过对Array进行改进,只增加了很低的复杂度却极大地增加了效率。它主要解决的问题便是Array再中间增加或者删除太过于缓慢的问题(数组的后半部分需要整体移动)。它将一个Array分为两个Array,中间插入一个Gap。它的优点在于,首先,Gap是随着光标的移动而移动的,光标向前移动100个字节,将前一个Array的最后100位移动到后一个Span的前面便可(当然还有一些标志位的改变),反之亦然,当然,如果只改变光标定位不去增加或者删除文本,这个移动操作也可以不执行以提高响应。其次,添加只需写到Gap中,删除只需从Gap中删除,无需数组进行整体移动。最后,当Gap写满时再进行运算,调整结构和重新生成Gap。所以这种方式很适合实现文本编辑器。

line span是很多文本编辑器采用的结构,它将每一行的数据用数据结构存储,并且维护一个记录每行地址的数据结构。

Fixed size buffers包含很多固定大小的buffer去存储数据,整个文件分散在buffer当中,添加删除尽可能地在单个buffer里操作,不会影响其他buffer,以提高速度。

piece table是作者主要推荐的数据结构,一个文本文件由两个Array组成,第一个Array存储的是原始文件,它是只读的,第二个Array在更改文件时使用,它是只能在末尾添加的,同时还有一个table用于记录当前序列的组成,这里管它叫记录表。

 

如果对文本序列执行了删除操作,array并不会更改,只会更改记录表。如下图所示便是在原序列删除large的表示方法。

如果要增加文本的话,文本会增加在第二个array当中,同时改变记录表,如下图便是再添加English的过程。

文章对除了line span的其余数据结构做了评测,评测内容包括增加,删除,定位等等,得出结论:综合来看,Gap和piece table是最好的方法。

至于文章为什么没有评测line span,它给出的解释是:line span是一种很老的方法以至于在现代文本编辑器中不建议使用。

然而没有什么数据结构是适合一切场景的,不同的数据结构在不同的场景中都能发挥优势。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章