我需要帮助为我的练习选择正确的数据结构。
对于输入,我已经给出了应该执行的操作数( 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 次操作后找到结束序列,这样如果它的元素是偶数< / em>然后执行 R ,否则执行 X 。在开始 PTR 显示第一个元素(如果存在),它应该全部在循环中。
对于帖子开头的给定示例,输出应为:
0 0 3 1
我知道这可能听起来令人困惑,所以让我告诉你这应该如何逐步发挥作用。
t = 1
开始顺序: 1 2 3
实际位置: PTR - &gt; 1
操作: X , c = 1
结束顺序: 1 0 2 3
结束职位:PTR - &gt; 0
t = 2
开始顺序: 1 0 2 3
实际位置: PTR - &gt; 0
操作: R , c = 2
结束顺序: 1 0 3
结束职位:PTR - &gt; 1
t = 3
开始顺序: 1 0 3
实际位置: PTR - &gt; 1
操作: X , c = 1
结束顺序: 1 0 0 3
结束职位:PTR - &gt; 0
解决方案是 PTR 的正确方向序列。因此输出应为:0 0 3 1
关于限制:
C序列的起始长度达到10 ^ 7
t 操作次数达到10 ^ 7
将 PTR 移至最多10 ^ 9次
我创建了我的算法,它基于循环链表。可行,但对某些测试来说太慢了。如果有人能帮助我找到最佳的数据结构,我将不胜感激。
我还得到了老师的提示,我应该使用二进制列表,但说实话,我在互联网上找不到任何有关此结构的内容!也许有人知道这件事并告诉我在哪里可以搜索有关它的信息?我得到任何帮助。
答案 0 :(得分:1)
使用circular doubly linked list。它有O(1)插入和删除。 (也许这就是你的导师所说的“二进制列表”。)
有趣的事实:您可以使用XOR trick code here来降低双向链接列表的内存利用率。由于更好的缓存行为,较低的内存利用率意味着大型列表的速度更快。 XOR链接列表上还有一个SO Q&A,列出了它的一些缺点。
答案 1 :(得分:0)
数据结构在很大程度上取决于您选择的实现语言中可用的数据结构。在大多数情况下,只需使用数组,并使用模数运算符调整索引。这将为您提供所需的循环性。
这假定您选择的语言具有基本插入和&amp;删除方法或切片以方便自己完成。
答案 2 :(得分:0)
R - &gt;删除索引PTR + 1上的元素c并向前移动PTR c次
看起来像单链接列表:PTR
指向列表元素,我们需要移除下一个元素并提前PTR
指针c
次。
X - &gt;在元素c之后插入,它在索引PTR上(因此在PTR + 1上插入),元素值为c-1,当然向前移动PTR c次。
也看起来像单链表。 PTR
指向列表元素,我们插入值为c-1
的下一个元素,并将PTR
指针提前c
次。
@dominosam你标记为正确的答案实际上是错误的。无需遍历列表,因此您只需要一个循环的单链表,如described, for example, on Wikipedia.