按顺序获取索引的算法

时间:2017-12-07 08:34:47

标签: algorithm sorting

我想按顺序从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()释放 但事先没有固定的约束。

是否有一种有效的算法/数据结构来分配/释放这些指数?

2 个答案:

答案 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上提问!