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