查找最小排除量(MEX)

时间:2017-10-11 18:07:16

标签: algorithm set game-theory

我正在寻找一种算法来查找mex但除了这个wiki链接之外找不到任何有用的东西。
读完之后我拿出了这段代码:

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)

这是正确的吗?无论我试过哪种测试用例似乎都有用,如果没有,请指导我。
就时间复杂而言,这是最好的方法吗?在Code for python3中对不起。

1 个答案:

答案 0 :(得分:2)

我通常将mex函数编码为:

nList = set(nList)
mex = 0
while mex in nList:
  mex += 1

您的代码存在的问题是,无法保证集合上的迭代顺序不断增加,因此您的原始代码有时会返回错误的答案。

你的测试用例没有解决这个问题的原因是因为我认为Python 3目前将整数值整数加到一个大的素数模块(可以在sys.hash_info.modulus中读取),然后从基于列表构建集合按其哈希值排序。实际上,这意味着对于正常大小的整数,您的集合将按顺序返回值,因此您的代码可以正常工作(但可能不会在Python 3的未来或替代实现上)。