最佳数据结构

时间:2020-08-07 13:55:38

标签: list algorithm data-structures tree heap

问题是:我有一个字符串输入,每行文本都按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行。 在输入中,我还有一些命令,例如:

  • 打印第3行
  • 使用给定的字符串更改第2行
  • 删除第3行(接下来的行会放大,因此4变成3,5变成4 ...)
  • 撤消
  • 重做

哪个是最好的数据结构?我从堆开始,因为一切都是有序的,但是如果删除节点,则需要往后推每行,并且堆会出现一些问题。我还考虑了持久树,因为我需要记住先例才能进行撤消和重做。

3 个答案:

答案 0 :(得分:0)

答案主要取决于您要优化的操作。

  1. 数组-访问最快。因此它将在打印线和换行上进行优化。
  2. 双头链表-除需要遍历头和尾之外的任何位置。但是,它可以轻松处理您的删除,撤消和重做情况。

对于撤消和重做功能,您应该创建一个单独的撤消堆栈,在其中存储已删除或已更改的节点及其旧状态。重做只是从堆栈中弹出元素以将它们重新应用到主列表中的问题。

答案 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个反映了撤消操作(将有助于重做操作)。

相关问题