在一系列n个算术级数元素中,[n / 2]个元素被改变。找出初始算术级数的差异

时间:2011-01-27 21:04:10

标签: algorithm puzzle

我有一个大小为n的列表,其中包含n个连续的算术级数成员,这些成员不是有序的。我用一些随机整数改变了这个列表中不到一半的元素。从这个新列表中,我如何找到初始算术级数的差异?

我想了很多,但除了蛮力,我无法想出任何其他事情:(

感谢你对这个问题的思考:)

2 个答案:

答案 0 :(得分:3)

一般情况下无法解决这个问题,并且100%确定您的答案是正确的。假设初始列表是以下算术级数(不按顺序):

1 3 2 4

随机改变不到一半的元素......比方说我们改变了2到5:

1 3 5 4

如果我们可以首先找出需要更改的数字以获得有效的混洗算术序列,那么我们可以轻松地解决问题中陈述的问题。但是,我们可以看到有多种可能的答案取决于我们选择更改的编号:

  • 6 ,3,5,4(差异为1)
  • 1,3, 2 ,4(差异为1)
  • 1,3,5, 7 (差异为2)

无法知道这些可能的序列中的哪一个是原始序列,因此您无法确定原始差异是什么。

答案 1 :(得分:1)

由于问题没有确定性解决方案(如@Mark Byers所述),您可以尝试概率方法。

很难获得原始进展,但通过比较元素之间的差异可以轻松获得其速率。原始的差异将是速率的倍数。

考虑从列表中获取2个元素(它们都属于原始序列的概率为1/4),并计算差异。这种差异(概率为1/4)将是该速率的倍数。将其分解为素数并计算它们(例如,12 = 2^^2 * 3将添加2到2的计数器并将增加3的计数器。)

经过多次这样的迭代(对Monte Carlo等概率方法来说,这似乎是一个很好的问题),你可以对计数器进行分析。

如果素数因子属于该比率,则其计数器至少为num_iteartions/4(如果出现两次,则为num_iterations/2

主要问题是小因子对随机输入的概率很大(例如,两个随机数之间的差异将有50%的可能性被2整除)。所以你必须要补偿它:因为3/4的差异是随机的,你必须考虑必须忽略2的计数器(3/8)*num_iterations。由于这也适用于2的所有幂,最简单的方法是通过仅取随机数之间的差异来预生成“白噪声掩码”。

编辑:让我们进一步采用这种方法。考虑你为随机数创建这个“白噪声掩码”(我们称之为 spectrum ),并认为它是base-1频谱,因为它们最小的“最大公共因子”是1.通过计算它对于算术序列的差异,您将获得base-R频谱,其中R是速率,并且它将等同于base-1频谱的移位版本。所以你必须找到R的值,这样

your_spectrum ~= spectrum(1)*3/4 + spectrum(R)*1/4

您还可以检查最大数量R,以便至少有一半的元素等于模R