【发布时间】:2018-03-05 07:26:08
【问题描述】:
在编写文本编辑器时,需要有一种数据结构,可以简单地将行号转换为文档偏移量。一个简单的实现将是文档偏移量的(数组)列表,但这有一个缺点,即在开头插入文本时,所有(!)较高的行偏移量都必须增加和/或移动(对于输入的新行)。建议什么样的树状数据结构在理想情况下只需要更新 1 个或几个元素 - 通过允许文档偏移量的访问变慢一点?
【问题讨论】:
标签: data-structures
在编写文本编辑器时,需要有一种数据结构,可以简单地将行号转换为文档偏移量。一个简单的实现将是文档偏移量的(数组)列表,但这有一个缺点,即在开头插入文本时,所有(!)较高的行偏移量都必须增加和/或移动(对于输入的新行)。建议什么样的树状数据结构在理想情况下只需要更新 1 个或几个元素 - 通过允许文档偏移量的访问变慢一点?
【问题讨论】:
标签: data-structures
有多种方法可以做到这一点。一种方法是摊销维持这些抵消的成本。如果您要插入文本,那么在您需要访问它们之前,后几行的偏移量是什么并不重要。您可以只保留一个“脏标志”,表示第 X 行之后的偏移量无效并且必须更新。然后,如果用户向下滚动几页,您只需重新计算用户需要访问的行的偏移量。如果你愿意,你可以有一个异步重新计算偏移量的后台任务。
有几个优化,包括创建多行的“块”。例如,假设您分配了 16 兆字节的块。您保留每个块的偏移量,然后在需要时解析块以找到行偏移量。如今的计算机速度非常快。解析 16 兆字节的文本缓冲区以查找每行的开头需要几微秒:用户不会注意到这一点。
我在我的博文 http://blog.mischel.com/2011/12/02/designing-a-better-text-file-viewer/
中详细讨论了这个问题【讨论】: