Algorithm 如何从未排序的正整数流中找到丢失的最小正整数?

Algorithm 如何从未排序的正整数流中找到丢失的最小正整数?,algorithm,Algorithm,可能重复: 您有一个未排序的正整数流。读取流中的所有数字后,必须确定流中缺少的最小正整数 示例: 正整数流:678912 答复:3 正整数流:1 2 3 4 5 及:6 正整数流:12 87 899 答复:1 我想在不使用任何额外数据结构的情况下解决这个问题。可能吗 我被这个问题困住了。我在网上做了所有我能做的研究,但是,没有运气。 任何人都可以帮助。您可以在读取数组时使用插入排序对其进行排序(查看数据如何来自流,这应该是有效的),然后对其进行迭代。如果缺少1,这就是您的答案。如果存在,您可以

可能重复:

您有一个未排序的正整数流。读取流中的所有数字后,必须确定流中缺少的最小正整数

示例: 正整数流:678912

答复:3

正整数流:1 2 3 4 5

及:6

正整数流:12 87 899

答复:1

我想在不使用任何额外数据结构的情况下解决这个问题。可能吗

我被这个问题困住了。我在网上做了所有我能做的研究,但是,没有运气。
任何人都可以帮助。

您可以在读取数组时使用插入排序对其进行排序(查看数据如何来自流,这应该是有效的),然后对其进行迭代。如果缺少
1
,这就是您的答案。如果存在,您可以迭代检查下一个整数是否是数组中的下一个数字,否则下一个整数就是缺少的数字。

您可以在读取数组时使用插入排序对数组进行排序(查看数据如何来自流,这应该是有效的),然后对其进行迭代。如果缺少
1
,这就是您的答案。如果存在,您可以迭代检查下一个整数是否是数组中的下一个数字,否则下一个整数就是缺少的数字。

如果满足以下两个约束,则存在一个方法。该算法将扫描流两次,需要256KB内存

  • 每个元素小于或等于
    0xFFFFFFFF
  • 流中的所有元素都是不同的
  • 下面显示了该算法

  • 分配一个数组:
    unsigned int bucket[2^16]
  • 扫描此流数据。如果当前数据是
    a
    ,则
    bucket[a>>16]+

  • 扫描此流后,查找值小于
    2^16
    的第一个bucket。缺少的第一个无符号整数在此bucket中。让此存储桶的索引为
    k
    ,剩余的第一个无符号整数为
    n
    。然后
    k*(2^16)在满足以下两个约束的情况下,存在一种方法。该算法将扫描流两次,需要256KB内存

  • 每个元素小于或等于
    0xFFFFFFFF
  • 流中的所有元素都是不同的
  • 下面显示了该算法

  • 分配一个数组:
    unsigned int bucket[2^16]
  • 扫描此流数据。如果当前数据是
    a
    ,则
    bucket[a>>16]+


  • 扫描此流后,查找值小于
    2^16
    的第一个bucket。缺少的第一个无符号整数在此bucket中。让此存储桶的索引为
    k
    ,剩余的第一个无符号整数为
    n
    。那么
    k*(2^16)你是如何读取数据流中的数字的?@Jordan Kaye:这有关系吗?这是一条流。@KarolyHorvath嗯,有可能只有在整个流被读取后,数字才可用,或者它们是单独可用的;这将影响可能的解决方案。@Jordan Kaye:对我来说,流意味着你不能进行随机访问。但让我们看看OP是怎么说的。@KarolyHorvath这是我问题的目的-只是为了澄清:)你是如何从溪流中读取数字的?@Jordan Kaye:这有关系吗?这是一条流。@KarolyHorvath嗯,有可能只有在整个流被读取后,数字才可用,或者它们是单独可用的;这将影响可能的解决方案。@Jordan Kaye:对我来说,流意味着你不能进行随机访问。但是让我们看看OP是怎么说的。@KarolyHorvath这是我问题的目的——只是澄清一下:)我没有数组。这是一个一个接一个的数字流。现在我可以在读取时创建一个数组,然后对其进行排序。但它没有那么有效。@xtrmcode au contaire。。。如果使用插入排序,它实际上应该非常快。考虑到您必须读取整个流,直到您可以报告丢失的数字,这甚至更有效。目前我没有看到更有效的解决方案。也许是一个位图,但只有在数字范围有限的情况下。“但是,是的,我同意有时候我可能不需要读取整个流。”-没有人这么说。你必须通读整条溪流。总是。@xtrmcode我同意,你总是必须阅读整个流,除非你有没有告诉我们的约束。我没有数组。这是一个一个接一个的数字流。现在我可以在读取时创建一个数组,然后对其进行排序。但它没有那么有效。@xtrmcode au contaire。。。如果使用插入排序,它实际上应该非常快。考虑到您必须读取整个流,直到您可以报告丢失的数字,这甚至更有效。目前我没有看到更有效的解决方案。也许是一个位图,但只有在数字范围有限的情况下。“但是,是的,我同意有时候我可能不需要读取整个流。”-没有人这么说。你必须通读整条溪流。总是。@xtrmcode我同意,你总是必须阅读整个流,除非你有没有告诉我们的限制。