如何在数组中保存数据以便在O(n)时间内打印它?

时间:2016-04-06 10:47:00

标签: data-structures

在游戏中,用户可以在每个回合中将1添加到n个计数器(编号为1,2,...,n)的一个计数器中。对于这场比赛,他有:

  • 返回计数器counter(i)内容的函数i。在O(1)时间。
  • 增加add(i)计数器的函数i。在O(1)时间。

  • 一个函数print(),按照降序打印按计数器内容排序的id。在O(n)时间。

如何在O(n)地点实施此类游戏?

我知道我应该将计数器保留在数组中,但如何在O(n)时间内打印它们?

1 个答案:

答案 0 :(得分:3)

您可以使用链接列表的数组和链接列表来解决它。

数组从计数器id映射到后面描述的计数器对象。

主列表是每个节点代表计数器金额的列表。每个这样的节点都有一个列表,其中包含具有该数量的所有计数器对象,每个计数器都有一个指针返回主列表的节点(代表该数量的节点)。

当您增加计数器i时,您可以在O(1)时间内使用数组获取对象,而不是使用指针到达此对象所在的节点,并且看看它代表的金额是多少。现在您可以简单地分离计数器对象,并将其附加到O(1)时间的下一个列表中(如果它不存在则创建这样的列表)。

打印很简单,只需遍历主列表就可以O(n)

Draw