说有一个清单。列表中的每个项目都有唯一的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,但我想我正在寻找通用算法。
答案 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)
如何保持列表排序。而且你可以轻松地从一端移除它。