问题是:我有一个字符串输入,每行文本都按1,2,3,4,5的顺序排序...例如,如果输入是< / p>
"1.Hi john 2. How are you? 3. XXXX 4.TTTTT"
输出将是:
(1)Hi john
(2) How are you?
(3) XXXX
(4)TTTTT
如果第5行和第6行尚未填充,则无法输入第7行。 在输入中,我还有一些命令,例如:
哪个是最好的数据结构?我从堆开始,因为一切都是有序的,但是如果删除节点,则需要往后推每行,并且堆会出现一些问题。我还考虑了持久树,因为我需要记住先例才能进行撤消和重做。
答案 0 :(得分:0)
答案主要取决于您要优化的操作。
对于撤消和重做功能,您应该创建一个单独的撤消堆栈,在其中存储已删除或已更改的节点及其旧状态。重做只是从堆栈中弹出元素以将它们重新应用到主列表中的问题。
答案 1 :(得分:0)
如果您希望大量添加和删除行,并且还希望通过行(当前)索引引用行,那么您需要的是order statistic tree。这是一种二叉树,除了常规的二叉树操作(包括有效的插入和删除)外,它还允许您按索引有效地访问项目。在这种情况下,它不是二叉 search 树,因为您没有排序键。您所有的访问都将按(当前)索引进行。
为了有效地支持撤消/重做,您还可以将树做成persistent data structure,使用“路径复制”部分修改数据,同时仍然允许访问其旧版本。 (路径复制对于顺序统计树是理想的,因为无论如何所有更新都会传播到根。)撤消将简单地还原到该旧版本。
但是:除非您要处理数百万或数十亿行,否则这些怪异的奇异数据结构将不值得您花时间。因此,尽管字面上的答案是“持久顺序统计树”,但实际的答案是“可能只是将内容放入数组中,并具有一堆撤消操作以支持撤消/重做”。
答案 2 :(得分:0)
您可以结合使用地图和双链接列表。
双链接列表:将存储实际字符串的位置,节点的索引将表示相应字符串的数量。
Ex->打印第3行,您将打印此列表中的第3个节点
地图:此处的键将是行号,值将是对Double链接列表的相应引用。这将有助于在链接列表中插入和删除新字符串。
Ex->删除第3行,从映射中找到第3行DLL节点的引用,更改DLL中的引用并删除第3行节点。更新和插入行的过程类似。
对于@John建议的撤消和重做,您可以使用2个不同的堆栈,其中1个反映已完成的操作(将有助于撤消操作),而1个反映了撤消操作(将有助于重做操作)。