我想按顺序从0开始为对象分配索引。当一个对象被销毁时,应该释放索引以供其他用途,例如:
allocate_index() returns 0
allocate_index() returns 1
allocate_index() returns 2
allocate_index() returns 3
allocate_index() returns 4
release_index(1)
release_index(3)
allocate_index() returns 1
allocate_index() returns 3
allocate_index() returns 5
这类似于在unix中使用open()分配文件描述符并使用close()释放 但事先没有固定的约束。
是否有一种有效的算法/数据结构来分配/释放这些指数?
答案 0 :(得分:4)
添加@ Deimos的回答。
只有已发布的索引需要存储在堆数据结构中,而不是所有可用索引,并使用其他变量来跟踪currentIndex
。这样,如果next_index
是连续的下一个而不是已发布的索引之一,则可以在O(1)
时间访问它,而不是从一堆可用索引中获取next_index
再次插入下一个可用索引。这两个都是O(log N)
次操作。
示例代码可能如下所示
#include <bits/stdc++.h>
class MaintainIndex
{
private:
int currentIndex;
set<int> releasedIndex;
public:
MaintainIndex()
{
currentIndex = 1;
}
MaintainIndex(int start)
{
currentIndex = start;
}
int get_index()
{
int nextIndex;
// No released indices available. Return the next consecutive one
if(releasedIndex.size() == 0)
{
nextIndex = currentIndex;
currentIndex += 1;
}
else //Return the smallest released index
{
nextIndex = *releasedIndex.begin();
releasedIndex.erase(releasedIndex.begin());
}
return nextIndex;
}
void release_index(int index)
{
releasedIndex.insert(index);
}
};
答案 1 :(得分:2)
我将使用可用索引的二进制堆。感谢大家的帮助+ downvoting +结束投票:总是很高兴在Stakoverflow上提问!