【发布时间】:2018-06-12 14:43:55
【问题描述】:
我需要帮助来为我的练习选择正确的数据结构。
对于输入,我已经给出了应该执行的操作数(t),然后是用空格分隔的自然数索引序列。 比如:
3 1 2 3
这意味着将在序列 {1,2,3} 上执行 3 个操作。
还定义了一个指针,它显示当前位置。我应该在该序列上执行的操作是:
R -> 移除索引 PTR+1 上的元素 c 并向前移动 PTR c 次
-
X -> 在元素 c 之后插入,该元素位于索引 PTR 上(因此插入到 PTR+ 1),值为 c-1 的元素,当然也将 PTR 向前移动 c 次。
李>
我的工作是在执行操作 R 和 X t 次后找到结束序列,这样如果它的元素是 even 然后执行 R,否则执行 X。一开始 PTR 显示第一个元素(如果存在),它应该全部在循环中。
对于帖子开头的给定示例,输出应该是:
0 0 3 1
我知道这听起来可能令人困惑,所以让我逐步向您展示这应该如何工作。
t = 1
开始顺序: 1 2 3
实际位置:PTR -> 1
操作:X,c=1
结束顺序: 1 0 2 3
结束位置:PTR -> 0
t = 2
开始顺序: 1 0 2 3
实际位置:PTR -> 0
操作:R,c=2
结束顺序: 1 0 3
结束位置:PTR -> 1
t = 3
开始顺序: 1 0 3
实际位置:PTR -> 1
操作:X,c=1
结束顺序: 1 0 0 3
结束位置:PTR -> 0
解决方案是从 PTR 开始的一个正确方向的序列。所以输出应该是:0 0 3 1
关于限制:
C 序列的起始长度可达 10^7
t 操作次数最多 10^7
将 PTR 向右移动最多 10^9 次
我创建了基于循环链表的算法。可以,但是对于某些测试来说太慢了。如果有人能帮助我找到最佳数据结构,我将不胜感激。
我的老师也提示我应该使用二进制列表,但老实说,我在互联网上没有找到任何关于这种结构的信息!也许也有人知道这件事并告诉我在哪里可以搜索有关它的信息?我会很感激任何帮助。
【问题讨论】:
-
在每个步骤中,是什么决定了您执行的是 X 还是 R?
-
我不确定“二进制列表”是什么意思——这不是我熟悉的数据结构术语。可以请教老师吗?我担心这句话有翻译错误。
-
t times so that if its element is even then do the R, else do the X,t从1开始,会是奇数,所以执行X。在2,它是偶数,R也是如此。 -
@IMCoins 我对二叉树树很熟悉;有问题的术语是“二进制列表”。
标签: algorithm performance list data-structures sequence