我需要生成唯一的数字,我可以想到连续的方式,例如,我可以有一个从0开始的计数器,每次需要一个唯一的数字我返回计数器并将计数器增加1,这只是工作直到我可能有很多超出数据类型范围的唯一数字(比如int),同样,生成的唯一数字,例如,计数器是10,但4和5不再使用,所以他们可以如果重复使用,如何在不保留数据结构的情况下使用可重用的数字?
谢谢!
答案 0 :(得分:0)
您是否可以替换已经发出的号码?如果是这样,那么只要返回任何数字,用它替换最近发出的数字并减少分配计数器。如果它是最近返回的那个,那么跳过替换。
否则,我想你能做的最好的事情就是保留一个排序的范围数组。
分配新号码:
如果数组为空,请创建一个新范围并返回其中唯一的数字。
否则,获取数组中的第一个范围并将其长度增加1.返回该数字。检查是否使前两个范围加入。如果是这样,那么将它们合并到一个范围内。
要返回一个数字:
找到它所在的范围(例如,通过二进制搜索;如果您的部署计划允许,请参阅NSOrderedSet
)。如果返回的数字位于范围的任一端,则只需缩小范围。否则将一个分成两个,返回的数字作为洞。