1
3
分配不能超过2^32。但是,如果释放了旧的句柄,您可以重新分配它们,问题是要跟踪空闲的句柄。 树是存储空闲句柄的好方法。每个节点都有一个最低和最高的句柄,左子树包含小于最低的句柄,右子树包含大于最高的句柄。 一个例子是:
如果释放了句柄,它将存储在树中。例如,如果释放10,则树看起来如下:
如果释放了句柄5,则可以选择优化树,因为可以将4添加到5-10节点中:
到:
句柄的分配,搜索具有1个句柄的叶节点并将其从树中删除。如果没有具有1个句柄的叶,只需使用叶并减少未连接到父级的一侧:
在上面的例子中,我们分配1而不是2,因为如果释放了3,您可以将它与4结合起来,并且您希望尽可能地减少节点的数量。 下面是一个伪代码算法。有些部分留给读者:
|
2
3
如果内存不是问题,那么您可以维护一个空闲句柄列表。当释放一个时,您将它添加回自由列表的末尾。 在开始时,您可以将所有ID添加到空闲列表中,但这样做效率很低。 您可以做的优化是维护一个可用的最小ID值以及空闲列表。因此,当列表为空时,您可以向自由列表添加一些ID(从维护的最小ID值开始),并更新最小ID值。 |
3
0
如果这个问题仅仅是“我如何快速、安全地计算出一个唯一的、目前没有使用过的数字”,那么一个小表格就会给出这个答案。 对于20万个唯一数字的顺序,200.000/8=需要的字节数=2.5万,这只需要25千字节的内存来跟踪。 当然,如果您需要在内存中跟踪与正在使用的句柄相关联的数据,那么您还需要其他东西。 另一个解决方案是保留一堆未使用的句柄,这可能会更快地获得一个新的句柄。每次你需要一个手柄,就从堆栈中弹出一个。 您可以用一个设定的数字为堆栈种子,但是算法也可以这样,如果您试图从空堆栈中弹出一个值,您只需通过增加一个不断增加的值来生成一个新的值。 既然您说在任何给定的时间内都将有大约20万个句柄处于活动状态,那么这个堆栈的大小永远不应该超过容纳那么多句柄的大小,所以您可以使用数组轻松地处理这个问题。一个200K的32位堆栈将消耗800.000字节,大约781KB的内存。 |
Eddiex045 · 比较两个文本文件,匹配项转到一个新文件 2 年前 |
NOBUD · 最大堆插入函数实现C++ 2 年前 |
riasc · 嵌套贴图结构创建空贴图 6 年前 |
Akshay Barpute · cpp中的以下链表程序有什么问题? 6 年前 |
Batwoman05 · C++中是否有具有类似函数的树集数据结构 6 年前 |