标签: data-structures
在游戏中,用户可以在每个回合中将1添加到n个计数器(编号为1,2,...,n)的一个计数器中。对于这场比赛,他有:
1
n
1,2,...,n
counter(i)
i
O(1)
增加add(i)计数器的函数i。在O(1)时间。
add(i)
一个函数print(),按照降序打印按计数器内容排序的id。在O(n)时间。
print()
O(n)
如何在O(n)地点实施此类游戏?
我知道我应该将计数器保留在数组中,但如何在O(n)时间内打印它们?
答案 0 :(得分:3)
您可以使用链接列表的数组和链接列表来解决它。
数组从计数器id映射到后面描述的计数器对象。
主列表是每个节点代表计数器金额的列表。每个这样的节点都有一个列表,其中包含具有该数量的所有计数器对象,每个计数器都有一个指针返回主列表的节点(代表该数量的节点)。
当您增加计数器i时,您可以在O(1)时间内使用数组获取对象,而不是使用指针到达此对象所在的节点,并且看看它代表的金额是多少。现在您可以简单地分离计数器对象,并将其附加到O(1)时间的下一个列表中(如果它不存在则创建这样的列表)。
打印很简单,只需遍历主列表就可以O(n)。