O(nlogn) 算法 - 在二进制字符串中找到三个均匀间隔的“1”

177

我昨天在算法测试中遇到了这个问题,但我无法找出答案,这让我非常疯狂,因为它占了大约40分。 我觉得大多数同学没有正确解决它,因为我过去24小时内也没有找到解决方案。

给定长度为n的任意二进制字符串,如果存在三个等间距的1,请编写一个算法在O(n*log(n))的时间内解决此问题。

像这样的字符串有三个“等间距”的1:11100000、0100100100

编辑:这是一个随机数,所以它应该适用于任何数字。 我给出的例子是为了说明“等间距”属性。 因此,1001011是一个有效的数字,其中1、4和7是等间距的1。


4
以下是否可能:10011010000?它有三个1(第一、二、四位)等间距分布,但也有额外的1。 - Anna
5
Robert,你需要让你的教授给你答案,并在这里发布。这个问题让我烦透了。我能够想出n^2的解法,但不是n*log(n)的。 - James McMahon
3
嗯,我也花了很长时间试图弄清楚这个问题,但仍然没有找到一个好的答案。也许你误解了问题?例如,如果问题是寻找一种运行时间为O(n log n)的算法,用于确定一个间隔为k的均匀序列在一个更大的序列中的位置,这可以使用快速傅里叶变换轻松完成。 - ldog
5
考虑到 Klaus Roth 在 1958 年因证明每个密度 d>0 都存在一个自然数 N,使得 {1,...,N} 的任何至少包含 d*N 个元素的子集都包含长度为 3 的等差数列而获得菲尔兹奖章,我并不惊讶目前还没有人找到令人信服的算法来解决这个问题。另请参见 http://en.wikipedia.org/wiki/Szemer%C3%A9di%27s_theorem - j.p.
2
ShreevatsaR的回答使得这个问题成为SO上最好的算法问题之一。 - Bob Aman
显示剩余23条评论
31个回答

-7

这个问题可以在线性时间O(n)内解决

  1. 从开头开始,等待第一个1的出现
  2. 开始计数0的个数
  3. 当你遇到1时,存储已经计数的0的数量(有效数字也是0)NumberOfZeros -> PrevZeros
  4. 重新开始计数0的个数
  5. 当你遇到1时,检查NumberOfZeros == PrevZeros

    如果为真,返回计数器

    否则,NumberOfZeros -> prev_zeros并且转到步骤4


2
@ralu,这是我在我的答案中所做的。问题更加复杂,因为1也可以是间隔符。 - James McMahon
我没有想到这一点,但如果整个Stack Overflow在2天内都没有解决这个问题,那么考试期间有人如何在1小时内解决这个问题呢? - Luka Rahne
1
我现在能想到的最好的主意是,如果没有解决方案,那么使用密度为至多n/ln(n)(来自素数密度的phi函数)的属性。 这意味着可以在n^2/log(n)的时间内解决这个问题。 - Luka Rahne
1
如果可以证明最坏情况密度在长期内为klog(n),则可以轻松地在nlog(n)时间复杂度内解决此问题。 - Luka Rahne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接