Wor*_*red 1 random algorithm data-structures
我正在使用C#,但即使你不知道它,也应该很容易理解这个问题.
这是我的问题:我有一些对象,我想保留在类似hashset的数据结构中,以便我可以根据intID 查找它们.这些对象具有可变属性,因此散列它们不是一个选项(我需要一些关于它们的常量哈希,是吗?).
我所做的是开发以下界面:
public interface IUniqueIDCollection
{
// Can return any int that hasn't been requested yet.
public int RequestUniqueID();
// Undos the requesting of an int
public int ReleaseUniqueID(int uniqueID);
}
Run Code Online (Sandbox Code Playgroud)
我最初的想法是只在IUniqueIDCollection请求ID时以该增量存储内部计数器.但是,一旦ID被释放,我将不得不跟踪已删除的范围或个人ID.我认为后者会更好.但是如果我使用一个计数器(或任何循环函数)来生成ID,我就会遇到这样的问题:一旦计数器回绕,我必须检查已经连续请求的ID序列.
启发式是这样的:假设一次最多可以请求5,000个ID.但是,ID经常要求然后发布.释放将倾向于在范围内发生 - 即可能一次请求100,然后所有100将在短时间间隔内释放.
我知道我可以使用GUID或其他东西而不是int,但我想节省ID的空间/带宽/处理时间.
所以我的问题是:考虑到启发式方法,请求和发布方法在上面给出的接口中,伪代码方面应该是什么样的?
如果您确定已发布的ID可以安全地立即重复使用(即,如果为新对象分配了最近发布的ID,则不会过时引用旧ID,如果新对象被分配了最近发布的ID,则会混淆)发布ID的第一个.因此,当ID被释放时,您将其放在队列的末尾.请求新ID时,使用队列中的第一个ID.如果队列为空,则递增内部计数器并给出新编号.
这种实施的优点:
缺点: