繁体   English   中英

使用的最佳数据结构

[英]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 行。 在输入中,我还有一些命令,例如:

  • 打印第 3 行
  • 用给定的字符串更改第 2 行
  • 删除第 3 行(下一行将放大,所以 4 变为 3,5 变为 4...)
  • 撤消
  • 重做

哪种数据结构最好实现? 我从堆开始,因为一切都是有序的,但是如果我删除一个节点,我需要将每下一行向上推,而且堆有一些问题。 我还考虑了持久树,因为我需要记住前面的步骤才能进行撤消和重做。

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

  1. 数组 - 访问速度最快。 所以它会优化打印线和换线。
  2. 双端链表 - 访问除了头尾需要遍历的任何地方。 但是,它可以轻松处理您的删除、撤消和重做情况。

对于您的撤消和重做 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM