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我同意,你总是必须阅读整个流,除非你有没有告诉我们的限制。