具有大量操作的自组织数字序列 - 最佳数据结构

时间:2018-01-02 22:24:06

标签: algorithm performance list data-structures sequence

我需要帮助为我的练习选择正确的数据结构。

对于输入,我已经给出了应该执行的操作数( 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次

我创建了我的算法,它基于循环链表。可行,但对某些测试来说太慢了。如果有人能帮助我找到最佳的数据结构,我将不胜感激。

我还得到了老师的提示,我应该使用二进制列表,但说实话,我在互联网上找不到任何有关此结构的内容!也许有人知道这件事并告诉我在哪里可以搜索有关它的信息?我得到任何帮助。

3 个答案:

答案 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.