【发布时间】:2020-11-28 04:39:45
【问题描述】:
我正在开始一个学校项目:我们必须用 c 编写一个高效的文本编辑器。要命令这个,我可以使用:
- (row1,row2)c
- (row1,row2)d
- (row1,row2)p
- (数字)u
- (数字)r
这些命令用于在 row1 和 row2 之间更改文本(c),删除 row1 和 row2 之间的文本(d,文本将替换为单个点),在 row1 和 row2 之间的 stdout 行上打印( p)、undo (number) times 或 redo (number times)(最后两个命令不影响打印,只影响 c 和 d)。 一开始我在想我可以使用什么数据结构。 我认为,对于行,使用带有行数的单个链接列表和第二个列表(用于文本本身)。 这是因为代码必须在时间和空间上高效 但在我的情况下,我没有找到实现撤消/重做的好方法:我在想两个创建两个堆栈,一个用于撤消,一个用于重做。我给它的每个命令都插入到撤消堆栈中,如果我撤消某些操作,我会删除撤消堆栈中的第一个操作并将其放入重做堆栈中
但是我不知道如何编写这些命令:我想保存一个补充命令,所以我可以运行这个命令并在前面的语句中返回。然后,当我撤消时,我在重做堆栈中创建补充命令,并删除每个新命令以释放空间
我希望它是可以理解的,我只是想听听您对这种可能的结构的看法 注意,理论上我只能在 c11 中使用 stdlib 和 stdio 进行编码,但如果需要,我可以复制和修改其他库的函数
---更新--- 我在想是否最好使用 R/B 树来保持行结构。这是因为它需要 O(log(n)) 来搜索第 X 行并对其进行编辑,而不是 O(n)
唯一的问题是,当我必须在一个命令中更改许多行(例如 1,521c)时,搜索每一行需要更长的时间
也许一种混合可能是一个不错的选择:我使用 RBT 结构来查找起始行地址,然后我使用列表结构来查找其他的。所以这棵树的每个节点都有 2 个 RBT 地址和 1 个列表地址
【问题讨论】:
标签: optimization data-structures text-editor c11 undo-redo