最有效的数据结构,为文本添加样式

时间:2010-11-15 15:03:37

标签: text data-structures text-editor styling styledtext

我正在寻找最佳的数据结构来为文本添加样式(比如在文本编辑器中)。该结构应允许以下操作:

  1. 快速查找绝对位置X
  2. 的所有样式
  3. 在任何位置快速插入文字(必须移动该位置后的样式)。
  4. 文本的每个位置都必须支持任意数量的样式(重叠)。
  5. 我已经考虑了包含文本范围的列表/数组,但是它们不允许快速插入而不重新计算插入点之后所有样式的位置。

    具有相对偏移的树结构支持#2,但是当我向文本添加大量样式时,树将快速退化。

    还有其他选择吗?

1 个答案:

答案 0 :(得分:4)

我从未开发过编辑器,但是如何:

我相信可以扩展用于存储文本字符的方案,当然取决于您的实现细节(语言,工具包等)以及您的性能和资源使用要求。

我不希望为样式使用单独的数据结构,而是希望有一个引用,它将伴随每个字符并指向具有适用字符的数组或列表。具有相同样式集的字符可以指向相同的数组或列表,以便可以共享一个。

字符插入和删除不会影响样式本身,除了更改对它们的引用数量,这可以通过一些引用计数来处理。

根据您的编程语言,您甚至可以通过指向列表的一半来压缩事物,尽管额外的簿记可能实际上使其效率更低。

此建议的主要问题是内存使用情况。在用C编写的ASCII编辑器中,由于结构对齐填充,将指针与每个char捆绑在一起会在64位系统上将其有效内存使用量从1个字节提高到12个字节。

我希望将文本分成小的可变大小的块,这样可以有效地压缩指针。例如。一个32个字符的块在C中可能看起来像这样:

struct _BLK_ {
    unsigned char size;
    unsigned int styles;
    char content[];
}

有趣的部分是struct的变量部分的元数据处理,它包含存储的文本和任何样式指针。 size元素表示字符数。样式整数(因此为32个字符的限制)将被视为一组32个1位字段,每个字段指示一个字符是否具有自己的样式指针,或者它是否应使用与前一个字符相同的样式。这样,具有单一样式的32-char块仅具有大小字符char,样式掩码和单个指针以及任何填充字节的额外开销。在这样的小数组中插入和删除字符应该非常快。

至于文本存储本身,树听起来是个好主意。也许是一个二叉树,其中每个节点值将是子值的总和,叶节点最终指向文本块,其大小为其节点值?根节点值将是文本的总大小,每个子树理想地保留一半文本。但是,您仍然需要对其进行自动平衡,有时必须合并半空文本块。

万一你错过了,我不是树木的专家: - )

编辑:

显然我建议的是这个数据结构的修改版本:

http://en.wikipedia.org/wiki/Rope_%28computer_science%29

在这篇文章中引用:

Data structure for text editor

编辑2:

建议的数据结构中的删除应该相对较快,因为它将归结为数组中的字节移位和样式掩码上的一些按位操作。插入几乎相同,除非块填满。在每个块中保留一些空间(即样式掩码中的一些位)以允许将来直接插入块中可能是有意义的,而不必为相对少量的新文本更改树本身。

在这样的块中捆绑字符和样式的另一个好处是,它的固有数据位置应该允许比其他替代方案更有效地使用CPU缓存,从而在一定程度上提高处理速度。

与任何复杂的数据结构非常相似,您可能需要使用具有代表性的测试用例或自适应算法进行分析,以确定其操作的最佳参数(块大小,任何保留空间等)。