我有一个大小为n的列表,其中包含n个连续的算术级数成员,这些成员不是有序的。我用一些随机整数改变了这个列表中不到一半的元素。从这个新列表中,我如何找到初始算术级数的差异?
我想了很多,但除了蛮力,我无法想出任何其他事情:(
感谢你对这个问题的思考:)
答案 0 :(得分:3)
一般情况下无法解决这个问题,并且100%确定您的答案是正确的。假设初始列表是以下算术级数(不按顺序):
1 3 2 4
随机改变不到一半的元素......比方说我们改变了2到5:
1 3 5 4
如果我们可以首先找出需要更改的数字以获得有效的混洗算术序列,那么我们可以轻松地解决问题中陈述的问题。但是,我们可以看到有多种可能的答案取决于我们选择更改的编号:
无法知道这些可能的序列中的哪一个是原始序列,因此您无法确定原始差异是什么。
答案 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的所有幂,最简单的方法是通过仅取随机数之间的差异来预生成“白噪声掩码”。
R
是速率,并且它将等同于base-1频谱的移位版本。所以你必须找到R的值,这样
your_spectrum ~= spectrum(1)*3/4 + spectrum(R)*1/4
您还可以检查最大数量R
,以便至少有一半的元素等于模R
。