查找列表中最低的未使用唯一ID

时间:2010-08-09 11:35:56

标签: algorithm list

说有一个清单。列表中的每个项目都有唯一的ID。

List [5, 2, 4, 3, 1]

当我从此列表中删除某个项目时,该项目中的唯一ID将随之显示。

List [5, 2, 3, 1]

现在说我要在列表中添加另一个项目,并为其提供最低的唯一ID。

在向列表中添加新项目时,获取最低唯一ID的最简单方法是什么?

这里有限制:如果我在删除项目时没有重新分配另一个项目的唯一ID,我更喜欢它。

我意识到,如果我在删除4时将唯一ID 5重新分配给唯一ID 4,那么很容易找到唯一ID。然后我可以获得列表的长度(5)并使用唯一ID创建新项目那个号码。

那么还有另一种方法,那就是不涉及遍历整个列表吗?

编辑:

语言是java,但我想我正在寻找通用算法。

6 个答案:

答案 0 :(得分:16)

一种简单快捷的方法是将已删除的ID放入优先级队列,只需在插入新的ID时从中选择下一个id(或者在队列为时使用第一个列表的size()+ 1作为id)空)。但是这需要另一个清单。

答案 1 :(得分:2)

您可以维护可用ID列表。

声明一个布尔数组(伪代码):

boolean register[3];
register[0] = false;
register[1] = false;
register[2] = false;

添加元素时,从寄存器底部循环,直到找到false值。将false值设置为true,将该索引指定为唯一标识符。

removeObject(index)
{
    register[index] = false;
}

getsetLowestIndex()
{
    for(i=0; i<register.size;i++)
    {
      if(register[i]==false)
      {
           register[i] = true;
           return i;
      }
    }

    // Array is full, increment register size
    register.size = register.size + 1;
    register[register.size] = true;
    return register.size;
}

删除元素时,只需将索引设置为false。

您可以通过使用连续性标记对较大的列表进行优化,这样您就不需要循环整个事物。

这对于索引没有特定顺序的示例最有效,因此您不必先对它们进行排序。

答案 2 :(得分:1)

它相当于搜索,只是这次你搜索丢失的号码。如果您的ID是整数排序,您可以从下到上开始检查两个ID之间的空格是否为1。 如果您知道列表中有多少项及其排序,则可以实现二进制搜索。

答案 3 :(得分:1)

如果不迭代列表,我认为你不能这样做。

当你说

  

'现在说我要添加另一个项目   列表,并给予最少   最高的独特身份。 “

我认为您的意思是要分配尚未在其他地方使用的最低可用ID。

你可以这样做:

private int GetLowestFreeID(List list){
    for (int idx = 0; idx < list.Length; ++i){
        if ( list[idx] == idx ) continue;
        else return idx;
    }
}

返回最低的自由索引。

这假定您的列表已排序,并且在C#中,但您明白了。

答案 4 :(得分:1)

用于执行此操作的数据结构是优先级二进制堆,仅允许唯一值。

答案 5 :(得分:1)

如何保持列表排序。而且你可以轻松地从一端移除它。