IDManager API提供了2种方法
你能帮我解决一下如何有效地解决这个问题吗? - 作为最好的DS使用,什么是存储和维护ID的最佳方式?
谢谢!
答案 0 :(得分:1)
将已使用的ID存储在HashSet
中,并将最后生成的ID保存在单独的变量中。
当有人致电get_ID
时,请递增上次生成的ID并验证其不在HashSet
中。继续这样做,直到找到不在HashSet中的ID。当您在HashSet
中找到一个不在其中的人时,请添加该值并返回该值。
当有人拨打free_ID(id)
时,只需将其从HashSet
删除即可。
对于get_ID
的前21亿次通话,ID值将继续递增,每次通话都会给出唯一的ID。然后,整数将滚动并开始重新使用ID。此时,检查HashMap
中是否会出现的代码将会启动,而get_ID
方法将开始花费更长时间,因为它会继续检查值以查找未使用的值
如果这成为ID值数十亿请求的问题,那么您可以创建一个Queue
来保存已使用和释放的ID。一旦ID值达到最大值,您就可以开始从队列的前面分配值,而不是递增计数器和搜索。我只会添加这部分,但是,如果有必要,因为它需要8 GB的RAM来保存整个列表。
另一种可能性是您希望您的ID永远是最低的值。如果是这种情况,那么您应该使用上面描述的Queue
,但在递增并生成新ID之前让get_ID
检查队列。这样,如果有任何已释放的ID号,则在创建新的更高值之前使用它们。此队列只会与您不再使用的ID一样大,因此它会扩展到您的要求大小。