[英]Best data structure to use
问题是:我有一个字符串输入,每行文本都按 1、2、3、4、5 排序...我必须将这些字符串放在每一行中,例如,如果输入是
"1.Hi john 2. How are you? 3. XXXX 4.TTTTT"
output 将是:
(1)Hi john
(2) How are you?
(3) XXXX
(4)TTTTT
如果第 5 行和第 6 行尚未填充,我无法输入第 7 行。 在输入中,我还有一些命令,例如:
哪种数据结构最好实现? 我从堆开始,因为一切都是有序的,但是如果我删除一个节点,我需要将每下一行向上推,而且堆有一些问题。 我还考虑了持久树,因为我需要记住前面的步骤才能进行撤消和重做。
答案主要取决于您要优化哪些操作。
对于您的撤消和重做 function,您应该创建一个单独的撤消堆栈,其中存储已删除或更改的节点及其旧 state。 重做是将元素从堆栈中弹出以将它们重新应用到主列表中的问题。
如果您希望大量添加和删除行,并且您还希望通过它们的(当前)索引来引用行,那么您想要的是一个order statistic tree 。 这是一种二叉树,除了正常的二叉树操作(包括有效的插入和删除)外,它还允许您通过索引有效地访问项目。 在这种情况下,它不是二叉搜索树,因为您没有排序键; 您的所有访问都将按(当前)索引。
为了有效地支持撤消/重做,您还需要将树变成一个持久的数据结构,使用“路径复制”来部分修改数据,同时仍然允许访问它的旧版本。 (路径复制对于顺序统计树来说是理想的,因为无论如何您的所有更新都会传播到根。)撤消只会恢复到那个旧版本。
但是:除非您处理数百万或数十亿行,否则这些奇怪的奇异数据结构将不值得您花时间。 因此,虽然字面上的答案是“持久顺序统计树”,但实际的答案是“可能只是将东西放在一个数组中,并有一堆撤消操作来支持撤消/重做”。
您可以使用 Map 和双链接列表的组合。
双链表:实际存放字符串的地方,节点的索引代表对应字符串的个数。
Ex-> 打印第 3 行,您打印此列表中的第 3 个节点
Map :这里的key是行号,value是对双链表的对应引用。 这将有助于在链接列表中插入和删除新字符串。
Ex -> 删除第 3 行,从 map 中找到第 3 行 DLL 节点的引用,更改 DLL 中的引用并删除第 3 行节点。 更新和插入行的类似过程。
对于@John 建议的撤消和重做,您可以使用 2 个不同的堆栈,1 个反映已完成的操作(这将有助于撤消),1 个反映撤消操作(这将有助于重做操作)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.