代码出现的时间复杂性 - 2016年第19天

时间:2017-10-05 00:35:28

标签: python algorithm josephus

代码问世Day 19的问题规定如下:

  

编号为1到N的精灵坐成一圈。每个精灵带来礼物。   然后,从第一个精灵开始,他们轮流偷走所有的精灵   从精灵到左边的礼物。一个没有礼物的精灵   从圆圈中移除并且不轮流。所以,如果N = 5,那么:

     
      
  • 精灵1带着精灵2的礼物。
  •   
  • Elf 2没有礼物而被跳过
  •   
  • Elf 3带着Elf 4的礼物。
  •   
  • Elf 4没有礼物也被跳过。
  •   
  • Elf 5收集Elf 1的两件礼物。
  •   
  • Elf 1和Elf 2都没有礼物,所以都跳过了。
  •   
  • Elf 3收录了Elf 5的三个礼物,结束了比赛。
  •   
     

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

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

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

我的知识显然缺乏,如果有人能帮助我更好地理解这是O(N ^ 2),我将不胜感激。我可以看一下,如果你要删除,然后在每次删除之后,尝试再次从列表的开头搜索下一个精灵,那是因为在这种情况下你每次删除的成本是N和N再次搜索下一个精灵所以N ^ 2总计。我正在做的是保持计数器列表中的位置,删除精灵,然后将计数器迭代到下一个位置。在这种情况下,我希望删除N成本,但不能用于索引(可能这是我错了,索引成本)。

0 个答案:

没有答案