缺少元素问题的时空权衡


14

这是一个众所周知的问题。

给定正整数数组A[1n],输出不在数组中的最小正整数。

该问题可以在空间和时间中解决:读取数组,在空间中跟踪是否发生,扫描最小的元素。O(n)O(n)1,2,,n+1

我注意到您可以为时间交换空间。如果仅具有内存,则可以进行轮操作,并获得时间。在特殊情况下,显然存在恒定空间二次时间算法。O(nk)kO(kn)

我的问题是:

这是最佳的折衷方案,即吗?一般来说,如何证明这种界限?timespace=Ω(n2)

假设RAM模型具有有限算法,并且可以随机访问O(1)中的数组。

这个问题的启示:在单带模型中回文的时空折衷(例如,请参见此处)。


2
不,您可以在对数组进行排序,然后在O n )中找到缺失的数字(第一个数字应为1,第二个数字应为2,否则您将找到它),可以完成这种排序inplace mergesort表示O 1 多余的空间,因此时间空间属于O n log n 。我不知道我是不是确切地遇到了您的问题(因此我没有回答,而且我也不知道是否存在更好的界限)。O(nlogn)O(1)O(nlogn)

我假设输入是只读的。(如果不是,则可以在时间/ O 1 空间中最佳解决该问题:将输入乘以2,并使用奇偶校验来模拟O n / O n 算法)O(n)O(1)O(n)/O(n)
sdcvvc

什么是恒定空间算法?似乎您需要为“显而易见” 的n 2版本空间lognn2
Xodarap 2012年

在此模型中,单词大小的整数取 ; 如果是更方便,你可以回答这个问题的任何变体与时间空间= Ω ñ 2O(1)对于一些常数ktimespace=Ω(n2logkn)k
sdcvvc 2012年

@sdcvvc,我无法理解您的算法,您能再介绍一下吗?(请注意,读入位需要O log n )。O(n)/O(1)O(logn)

Answers:


2

这可以通过O(nlogn)字操作和O(1)字的存储器来完成(在位级RAM模型中分别为O(nlog2n)次和O(logn)存储器)。实际上,解决方案将基于以下观察。

说有n0偶数和n1奇数在范围[1,n+1](所以n0n1n0+n1=n+1)。再有就是b{0,1},使得有至多nb1值与奇偶b在输入。确实,否则至少存在n0输入中的偶数和至少n1奇数值,这意味着输入中至少存在n0+n1=n+1值,这是矛盾的(其中只有n个)。这意味着我们可以仅在奇数或偶数中继续搜索丢失的数字。同样的算法也可以应用于二进制符号的更高位。

因此我们的算法将如下所示:

  1. 假设我们现在已经仅存在x与其余模输入值2b等于r[0,2b),但至少有x+1号码范围[1,n+1]具有余数r2b(一开始我们肯定会确定b=0,r=0)。

  2. 说,有x0值与其余部分的输入r2b+1x1的值与其余部分的输入r+2b2b+1(我们可以发现在一个单次通过输入这些数字)。显然,x0+x1=x。此外,由于输入中至少有x+1数字,且余数为r2b,因此至少有一对(r,b+1),(r+2b,b+1)满足步骤1的要求。

  3. 我们已经发现丢失的数目时2bn+1:存在范围只有一个号码[1,n+1]可以具有剩余r2br本身,如果它是在范围),所以有在输入中大多数具有零值的零值。所以,r确实丢失。

显然,该算法以O(logn)步骤暂停,每个步骤都需要O(n)时间(在输入数组上单次通过)。此外,仅需要O(1)字的存储空间。


很高兴看到在此之后回答的问题:)
sdcvvc

1

如果我理解您的定义,那么可以在线性时间和恒定空间内完成此操作。显然这是最低界限,因为我们至少需要读取整个输入。

在给出的答案这个问题的满足。

用更少的时间或空间来运行它是不可能的,添加额外的时间或空间是没有用的,因此这里没有时空的权衡。(观察,因此无论如何您观察到的权衡都不是渐近的。)n=O(n/k)

关于您的一般性问题,我不知道会有任何好的定理可以帮助您证明时空权衡。这个问题似乎表明没有一个(已知的)简单答案。基本上:

假设某种语言在时间(使用一定的空间)和s空间(使用一定的时间)中是可确定的。我们是否可以找到f g,使得L可以由在f t s 时间和g t s 空间中运行的M决定?tsf,gLMf(t,s)g(t,s)

未知,一个强有力的答案将解决很多悬而未决的问题(最明显的是关于SC的问题),这意味着不存在简单的解决方案。


编辑:好的,与重复(但我仍然假设发生了尺寸的输入的最大可能数目是Ñ + 1)。nn+1

观察到我们的算法需要能够区分至少可能的答案。假设每经过一次数据,我们最多可以获得k个数据。然后,我们将需要n / k次通过才能区分所有答案。假设k = n / s,那么我们在n中运行nkn/kk=n/s时间。所以我认为这证明了您想要的。nn/sn=sn

困难在于显示每次通过时我们只能得到位。如果您假设我们唯一的合法操作是=,那么我们很好。但是,如果您允许进行更复杂的操作,那么您将可以获得更多信息。k


3
您链接的问题假设每个数字最多出现一次。我没有做出此假设,因此该解决方案不适用。谢谢您的第二个链接。
sdcvvc 2012年

@sdcvvc:我的错误,我以为您使用的是我熟悉的版本。我没有完整的答案,但是评论太久了-希望我的编辑有用。
Xodarap

5
我不赞成在“编辑”之后提出您的论点。即使一次只能收集,原则上也足以区分2 k个可能的输出。因此,此参数只能表示n / 2 k通过的下限,而不是n / kk 2kn/2kn/k
JeffE 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.