【问题标题】:Self-organising sequence of numbers with big amount of operations on it - best data structure具有大量操作的自组织数字序列 - 最佳数据结构
【发布时间】: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 次。

    李>

我的工作是在执行操作 RX t 次后找到结束序列,这样如果它的元素是 even 然后执行 R,否则执行 X。一开始 PTR 显示第一个元素(如果存在),它应该全部在循环中。

对于帖子开头的给定示例,输出应该是:

0 0 3 1

我知道这听起来可能令人困惑,所以让我逐步向您展示这应该如何工作。

t = 1

开始顺序: 1 2 3

实际位置:PTR -> 1

操作:Xc=1

结束顺序: 1 0 2 3

结束位置:PTR -> 0

t = 2

开始顺序: 1 0 2 3

实际位置:PTR -> 0

操作:Rc=2

结束顺序: 1 0 3

结束位置:PTR -> 1

t = 3

开始顺序: 1 0 3

实际位置:PTR -> 1

操作:Xc=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, t1 开始,会是奇数,所以执行X。在2,它是偶数R也是如此。
  • @IMCoins 我对二叉树很熟悉;有问题的术语是“二进制列表”。

标签: algorithm performance list data-structures sequence


【解决方案1】:

R -> 删除索引 PTR+1 上的元素 c 并将 PTR 向前移动 c 次

看起来像一个单链表:PTR 指向一个列表元素,我们需要移除下一个元素并将PTR 指针前进c 次。

X -> 在索引 PTR 上的元素 c 之后插入(因此在 PTR+1 上插入),值为 c-1 的元素,当然也将 PTR 向前移动 c 次。

看起来也像一个单链表。 PTR 指向一个列表元素,我们插入下一个元素值为c-1 并推进PTR 指针c 次。

@dominosam 您标记为正确的答案实际上是错误的。不需要遍历链表,只需要像described, for example, on Wikipedia.这样的循环单链表

【讨论】:

    【解决方案2】:

    使用circular doubly linked list。它有 O(1) 的插入和删除。 (也许这就是你的导师所说的“二进制列表”的意思。)

    有趣的事实:您可以通过XOR trickcode here 降低双向链表的内存使用率。由于更好的缓存行为,较低的内存利用率将意味着更大的列表速度更快。 XOR 链表上还有一个SO Q&A,它详细列出了它的一些缺点。

    【讨论】:

    • 非常感谢您,先生!我觉得这可能是解决方案。我会尽快开始实施。
    【解决方案3】:

    数据结构在很大程度上取决于您选择的实现语言中可用的那些。在大多数情况下,只需使用数组,并使用模运算符调整索引。这将为您提供所需的循环性。

    这假设您选择的语言具有基本的插入和删除方法,或切片以方便您自己进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2013-01-18
      • 1970-01-01
      • 2013-06-22
      • 2020-07-26
      相关资源
      最近更新 更多