0

Advent of Code Day 19的问题具体如下:

编号为 1 到 N 的精灵围成一圈。每个精灵都会带来一份礼物。然后,从第一个精灵开始,他们轮流从左边的精灵那里偷走所有的礼物。一个没有礼物的精灵被从圈子中移除并且不轮流。因此,如果 N = 5,则:

  • 精灵 1 带走了精灵 2 的礼物。
  • 精灵 2 没有礼物被跳过
  • 精灵 3 需要精灵 4 的礼物。
  • 精灵 4 没有礼物,也被跳过了。
  • 精灵 5 拿走了精灵 1 的两个礼物。
  • Elf 1 和 Elf 2 都没有礼物,所以都被跳过了。
  • 精灵 3 拿走了精灵 5 的三个礼物,游戏结束。

谁最终得到了 N 的一般情况下的所有礼物?

在解决了这些问题之后,我总是喜欢看别人的解决方案来学习一些新的技巧。我通读的其中一个解决方案是 Peter Norvig 的解决方案我注意到他提到从列表中删除每个收到礼物的精灵是 O(N^2)。

从经验上讲这是有道理的,因为这基本上就是我所做的,而且我的解决方案非常缓慢,但我认为从列表中删除,假设为链表,是 O(N) (或者特别是 O(N) 迭代到删除点,和 O(1) 用于实际删除)。

我在这里显然缺乏知识,如果有人能帮助我更好地理解这是 O(N^2),我将不胜感激。如果您要删除,然后在每次删除后,尝试再次从列表的开头搜索下一个精灵,我可以看到会是什么情况,因为在这种情况下,每次删除的成本为 N然后 N 再次搜索下一个精灵,总共 N^2。我所做的是保留我在列表中的位置的计数器,删除一个精灵,然后将计数器迭代到下一个位置。在那种情况下,我预计会产生 N 删除成本,但不会产生索引(也许这是我错的地方,索引成本)。

4

0 回答 0