1

我需要生成唯一的数字,我可以想到连续的方式,例如,我可以有一个从 0 开始的计数器,每次需要一个唯一的数字时,我都会返回计数器并将计数器加 1,这很简单,直到我可能有很多超出数据类型范围的唯一数字(比如 int),此外,生成的唯一数字,例如,计数器是 10,但不再使用 4 和 5,因此它们可以重新使用过,如何在不将所有数字保留在数据结构中的情况下使用可重用数字?

谢谢!

4

1 回答 1

0

你能用你已经分发的数字代替吗?如果是这样,那么只要返回任何数字,就用它替换最近分发的一个并减少分配计数器。如果它是最近返回的,则跳过替换。

否则,我想你能做的最好的事情就是保持一个排序的范围数组。

要分配新号码:

如果数组为空,则创建一个新范围并返回其中唯一的数字。

否则,获取数组中的第一个范围并将其长度增加 1。返回该数字。检查这是否使前两个范围合并。如果是这样,则将它们合并到一个范围内。

要返回一个数字:

找到它所在的范围(例如,通过二分搜索;查看NSOrderedSet您的部署计划是否允许)。如果返回的数字位于范围的任一端,则只需缩小范围。否则将一分为二,以返回的数字作为孔。

于 2012-10-30T05:54:59.007 回答