Algorithm 查找最小排除剂(MEX)

Algorithm 查找最小排除剂(MEX),algorithm,set,game-theory,Algorithm,Set,Game Theory,我正在寻找一个算法,但找不到任何有用的,除了这个维基链接。 读完后,我调出以下代码: nList = [int(x) for x in input().split()] nList = set(nList) mex = 0 for i in nList: if i<=mex: mex += 1 if mex == max(nList): print(mex+1) else: print(mex) nList=[int(x)表示input()中的x。

我正在寻找一个算法,但找不到任何有用的,除了这个维基链接。
读完后,我调出以下代码:

nList = [int(x) for x in input().split()]
nList = set(nList)
mex = 0
for i in nList:
    if i<=mex:
        mex += 1
if mex == max(nList):
    print(mex+1)
else:
    print(mex)
nList=[int(x)表示input()中的x。split()]
nList=集合(nList)
mex=0
对于nList中的i:

如果ii,则通常将mex功能编码为:

nList = set(nList)
mex = 0
while mex in nList:
  mex += 1
代码的问题在于,不能保证集合上的迭代顺序是递增的,因此原始代码有时可能返回错误的答案


您的测试用例之所以没有出现这种情况,是因为我认为Python3当前将整数散列为其值,并将其模化为一个大素数(可以在sys.hash_info.module中读取),然后根据其散列值排序,从列表中构造集。在实践中,这意味着对于正常大小的整数,您的集合将按顺序返回值,因此您的代码可以工作(但可能不适用于Python 3的未来或替代实现)

就时间复杂度而言,我们能做得更好吗?如果输入是按排序的顺序进行的,您可以做得更好,否则很难为每个“mex in nList”调用进行排序。它需要o(n)个时间吗?根据或者是整个迭代?你的值将散列到不同的点,只要它们的大小合理,所以每次迭代你应该得到O(1)