Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更有效的方法来查找丢失的整数?_Python_Algorithm - Fatal编程技术网

Python 有没有更有效的方法来查找丢失的整数?

Python 有没有更有效的方法来查找丢失的整数?,python,algorithm,Python,Algorithm,我目前正在一所大学学习一个叫做数据结构和算法的模块。我们的任务是编写一个算法,找到给定序列中不存在的最小正整数。我找到了一个解决方案,但有没有更有效的方法 x = [5, 6, 3, 1, 2] def missing_integer(): for i in range(1, 100): if i not in x: return i print(missing_integer()) 说明包括一些示例: 给定x=[1,3,6,4,1,2],函

我目前正在一所大学学习一个叫做数据结构和算法的模块。我们的任务是编写一个算法,找到给定序列中不存在的最小正整数。我找到了一个解决方案,但有没有更有效的方法

x = [5, 6, 3, 1, 2]

def missing_integer():
    for i in range(1, 100):
        if i not in x:
            return i

print(missing_integer())
说明包括一些示例:
给定x=[1,3,6,4,1,2],函数应返回5,
给定x=[1,2,3],函数应该返回4和

给定x=[−1.−3] ,函数应返回1。

您没有要求使用最有效的方法来解决问题,只是有一种方法比您的方法更有效。答案是肯定的

如果缺少的整数接近整数范围的顶部,并且列表很长,则算法的运行时效率为
O(N**2)
——循环遍历所有可能的值,
not in
操作符在未找到匹配项时搜索整个列表。(您的代码只搜索到值
100
——我假设这只是您的一个错误,您希望处理任意长度的序列。)


这里有一个简单的算法,它只是顺序
O(N*log(N))
。(注意,存在更快的算法——我展示了这个算法,因为它很简单,因此很容易回答您的问题。)对序列进行排序(其顺序与我所述的顺序相同),然后从最小的值开始遍历它。这种线性搜索很容易找到丢失的正整数。该算法还有一个优点,即序列可能涉及负数、非整数和重复数,并且代码可以轻松处理这些。这也可以处理任意大小的序列和任意大小的数字,当然,对于更长的序列,它运行的时间更长。如果使用了一个好的排序例程,内存使用量会非常小。

另一种解决方案是创建一个大小为
Max
值的数组,并遍历该数组,并在看到该值时标记数组的每个位置。然后,从数组开始迭代,并将第一个找到的未标记位置报告为最小缺失值。这是在
O(n)
中完成的(填充数组并找到最小的未标记位置)

此外,对于负值,您可以将所有值与
Min
值相加,以查找所有正值。然后,应用上述方法。 该方法的空间复杂度为
\Theta(n)

要了解更多信息,请参阅实现并详细检查此方法。

只需一点数学知识即可在O(n)时间内完成。初始化最小值和最大值,求和值名称,然后在数字之间循环一次,以找到最小值和最大值以及所有数字的总和
(mn、mx、sm)

现在整数之和
0..n=n*(n-1)/2=s(n)

因此:
missing_number=(s(mx)-s(mn))-sm


只需遍历一次数字即可完成所有操作

算法中的慢步骤是:

if i not in x:
这一步需要线性时间,这使得整个算法
O(N*N)
。如果首先将列表转换为一个集合,则查找速度会快得多:

def missing_integer():
    sx = set(x)
    for i in range(1, 100):
        if i not in sx:
            return i

集合中的查找速度很快,事实上它需要恒定的时间,并且算法现在以线性时间O(N)运行。

我认为
O(N)
算法是这样的:将长度为
N+2
(Python中的列表)的数组记录初始化为
None
,然后迭代输入。如果元素是数组索引之一,请将记录中的元素设置为
True
。现在从索引1开始迭代新的列表记录。返回遇到的第一个
None

@OmG:您的链接问题表明数组中只缺少一个整数(在给定范围内),而这里的问题允许缺少许多整数,并要求返回最小的整数。这是一个非常不同的问题,需要一个非常不同的算法。此问题也没有先前确定的范围。所以这个问题不是另一个问题的重复。是否保证
x
中的所有值都是唯一的(并且是正的)?唯一让我想到的大问题是任意搜索范围,如果你的列表超过100怎么办?还是从1开始?请考虑将代码< >范围(1100)< /代码>改为<代码>范围(min(x),max(x)+ 1)< /代码>,根据指令,我认为X中的数字可以包含重复和负数。它确实给出了一些例子:给定x=[1,3,6,4,1,2],函数应该返回5,给定x=[1,2,3],函数应该返回4,给定x=[−1.−3] ,函数应该返回1。@Jaye注意,非正整数的存在不会影响答案,因此您可以简单地假设没有。(作为第一步,您可以删除所有这些值,然后专注于剩下的内容。)为了完整性,请注意有一个O(n)算法;排序并不是解决这个问题的最有效的方法。@chepner:是的,我本想提的,但没提。我现在要补充一点。谢谢你的提醒。这个算法只在缺少一个数字的情况下有效,但情况可能并非如此。如果最小值为
2
,它也不起作用,因为返回值应为
1
。在撰写本文时,只提到了一个缺少的整数。我看不出2有什么特别之处,请解释。问题陈述不包括
integer
s缺失的计数或唯一性承诺。该示例正好显示缺少一个。在注释中添加了更多的示例,包括on,其中没有“中间缺少元素”,有一个重复,还有一个预期结果远高于
最大值
“[创建]一个大小为
Max
value的数组”-如果某些条目较大(例如,数十亿),这似乎不实用[最大值的大小]似乎不实用<