Algorithm 按顺序获取索引的算法

Algorithm 按顺序获取索引的算法,algorithm,sorting,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 allocat

我想从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
这类似于使用open()在unix中分配文件描述符,使用close()释放文件描述符。
但没有预先确定的界限


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

我将使用可用索引的二进制堆。感谢所有人的帮助+否决票+结束票:总是很高兴在Stakoverflow上提问

我将使用可用索引的二进制堆。感谢所有人的帮助+否决票+结束票:总是很高兴在Stakoverflow上提问

增加@Deimos的答案

只有发布的索引需要存储在堆数据结构中,而不是所有可用的索引,并使用附加变量跟踪
currentIndex
。这样,如果
next\u索引
是连续的下一个索引,而不是从发布的索引中的一个索引,则可以在
O(1)
时间内访问它,而不是从可用索引堆中提取
next\u索引
并再次插入下一个可用索引。这两个都是
O(logn)
操作

示例代码可能如下所示

#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);
    }
};
#包括
类别索引
{
私人:
int-currentIndex;
设置releasedIndex;
公众:
维护索引()
{
currentIndex=1;
}
维护索引(int start)
{
当前索引=开始;
}
int get_index()
{
int nextIndex;
//没有可用的发布索引。返回下一个连续索引
if(releasedIndex.size()==0)
{
nextIndex=当前索引;
currentIndex+=1;
}
else//返回最小的已发布索引
{
nextIndex=*releasedIndex.begin();
releasedIndex.erase(releasedIndex.begin());
}
返回下一个索引;
}
无效释放索引(整数索引)
{
释放索引插入(索引);
}
};

添加到@Deimos的答案中

只有发布的索引需要存储在堆数据结构中,而不是所有可用的索引,并使用附加变量跟踪
currentIndex
。这样,如果
next\u索引
是连续的下一个索引,而不是从发布的索引中的一个索引,则可以在
O(1)
时间内访问它,而不是从可用索引堆中提取
next\u索引
并再次插入下一个可用索引。这两个都是
O(logn)
操作

示例代码可能如下所示

#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);
    }
};
#包括
类别索引
{
私人:
int-currentIndex;
设置releasedIndex;
公众:
维护索引()
{
currentIndex=1;
}
维护索引(int start)
{
当前索引=开始;
}
int get_index()
{
int nextIndex;
//没有可用的发布索引。返回下一个连续索引
if(releasedIndex.size()==0)
{
nextIndex=当前索引;
currentIndex+=1;
}
else//返回最小的已发布索引
{
nextIndex=*releasedIndex.begin();
releasedIndex.erase(releasedIndex.begin());
}
返回下一个索引;
}
无效释放索引(整数索引)
{
释放索引插入(索引);
}
};

使用hashmap?您不需要任何特殊算法。只需使用两种结构:具有(最小索引、最大索引)的元组和元组给定范围内的可用/已发布索引列表。一旦请求索引,首先检查该列表。如果列表为空,则移动元组中的最大索引。@Gijs:hashmap作为无冲突概率。这个算法没有。我以为java hashmap是冲突保存的,你用的是哪种语言?不,这不是关于0/1的位图。如果没有索引被释放,你不需要遍历所有元素。使用hashmap?你不需要任何特殊的算法。只需使用两种结构:具有(最小索引、最大索引)的元组和元组给定范围内的可用/已发布索引列表。一旦请求索引,首先检查该列表。如果列表为空,则移动元组中的最大索引。@Gijs:hashmap作为无冲突概率。这个算法没有。我以为java hashmap是冲突保存的,你用的是哪种语言?不,这不是关于0/1的位图。如果没有发布索引,则不需要遍历所有元素