寻找位移最大值的线性时间算法


11

假设给定一个数组其中包含非负整数(不一定是唯一的)。A[1..n]

令为升序排列。我们要计算 BA

m=maxi[n]B[i]+i.

显而易见的解决方案是对A进行排序A,然后计算m。这给出了在最坏情况下在时间O(n \ lg n)上运行的算法O(nlgn)

有可能做得更好吗?我们可以计算m的线性时间?


我的主要问题是上述问题。但是,了解该问题的以下概括将很有趣。

BA根据oracle \ leq的比较排序f为oracle提供的函数。给定\ leqf的Aoracles,对于计算m = \ max_ {i \ in [n]} f(B [i],i)所需的时间,我们能说什么?fm=maxi[n]f(B[i],i)

我们仍然可以在O(n \ lg n)时间中计算m。但是我们可以证明这种广义情况下的超线性下界吗?mO(nlgn)

如果答案是肯定的,那么如果我们假设是整数的通常顺序并且f是“ nice”函数(单调,多项式,线性等),那么下界是否成立?

Answers:


10

我们可以计算线性时间中的。m

为了简单起见,假设数组基于0:,。我们要计算。A[0..n1]B[0..n1]m=maxiB[i]+i

令。显然。max=maxiA[i]maxm

排序后,令为。如果有 A[j]B[k]A[j]maxn

B[k]+kB[k]+(n1)=A[j]+(n1)(maxn)+(n1)=max1<maxm.

因此,当时,我们可以忽略。我们只需要考虑范围内的数字。A[j]A[j]maxn[maxn,max]

我们可以使用计数排序对线性时间在 范围内的中的数字进行排序,并使用排序列表计算。A[maxn,max]m


... mmm ...但是C [x] = C [x] +1的成本是多少?
Marzio De Biasi

1
您的答案有问题吗?因为在我看来,这很好:您是说我们只关心值的数组元素,因此我们可以使用计数排序。每当时,这都适用于一般问题对所有。[Mn,M]|f(B[i],i)B[i]|=O(n)i
Sasho Nikolov

谢谢@Marzio。:)为了清晰起见,我对您的答案进行了略微编辑。随时回滚我的编辑或进一步编辑。
卡夫(Kaveh),

1
对于所有和,任何,此解决方案似乎也适用。f(x,i)xin|f(x,i)x|=O(n)
卡夫(Kaveh),

@Kaveh:编辑可以!我很快就写下答案,甚至不确定它的正确性:-S
Marzio De Biasi 2013年

-1

如果数组由不同的整数组成,则,因为相邻条目之间的距离至少为;当不需要区分它们时,情况会更有趣。Am=max(A)+1B1

对于更笼统的问题,请想象当时仅“有趣”的情况。这似乎可以构建一个对手参数,它迫使你查询对所有可以知道前因此你需要理清以找到答案,需要比较。(这有一些复杂性,因为有可能我们可以通过查询而不是线性时间来测试是恒定的。)即使是(高次)多项式。f(B[i],j)i=jf(B[i],i)imaxif(B[i],i)AΩ(nlogn)A[i]=B[j]f(A[i],j)f


1
如果A有n-1个零和一个单数怎么办?那么答案是n,而不是1
格里戈里Yaroslavtsev

嗨,尤瓦尔。可以有重复的数字。正如Grigory所说,该解决方案似乎不起作用。A
卡夫(Kaveh),

我想我看到你的想法的下限参数:给定我们可以计算迅速使用到中进行的查询对通过算法解决时间问题。我们可以确保算法对所有都查询但不能确保它不查询其他对。但是,我们可以将其他对的设置为可区分的值,以便我们可以丢弃这些对。ABfo(nlgn)f(B[i],i)f
卡夫
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.