Arrays 如何计算;“预期”;半随机整数数组中的逆数?

Arrays 如何计算;“预期”;半随机整数数组中的逆数?,arrays,algorithm,math,random,Arrays,Algorithm,Math,Random,考虑一个整数数组。如果iA[j],则对(i,j)在A中称为反转 对于数组中的每个位置“i”,都有两个可能的候选位置:概率为p[i]的a[i]和概率为1-p[i]的a[i]+x 现在我必须计算预期的反转数。 给定每个索引i和整数x的[i]和p[i] 我知道O(n^2)方法(检查所有可能的合法配对)。 此外,我知道O(nlogn)方法,用于计算阵列中所有元素都以100%概率预先确定的反转数。它是通过修改合并排序来完成的 我想知道一种比n平方更好的方法。请让我知道。我留下了一条解释这一点的评论,但是如

考虑一个整数数组。如果iA[j],则对(i,j)在A中称为反转

对于数组中的每个位置“i”,都有两个可能的候选位置:概率为p[i]的a[i]和概率为1-p[i]的a[i]+x

现在我必须计算预期的反转数。 给定每个索引i和整数x的[i]和p[i]

我知道O(n^2)方法(检查所有可能的合法配对)。 此外,我知道O(nlogn)方法,用于计算阵列中所有元素都以100%概率预先确定的反转数。它是通过修改合并排序来完成的


我想知道一种比n平方更好的方法。请让我知道。

我留下了一条解释这一点的评论,但是如果你只需要使用一点数学知识,你就可以对此进行O(1)计算。我可以省去你的工作,但是,根据我的计算,在一个由n个整数组成的数组中,预期的反转数是((n^2)-(n))/4。很抱歉,括号太多了,我只是想确保这是完全清楚的。如果你想要的话,我可以把它贴出来,但如果你只需要答案,我想我会把它删掉


所以,不管我怎么说,我记错了。这不是lg(n)。

这可以通过对基于合并排序的倒数计数标准算法的简单修改来实现,我们为每个值分配一个权重,并计算
iA[j]
W[i]*W[j]
之和(当每个权重为1时,我们得到正常计数)。我们将这些元素的权重之和乘以我们正在处理的右数组中元素的权重,而不是将左数组中剩余的元素数添加到计数中


要使用此算法解决所提出的问题,只需创建一个大小为两倍的数组,其中原始数组中的每个元素都由两个元素(按排序顺序)替换,权重由概率给出。

为什么您希望有比O(n log(n))更好的解?我只知道当阵列的所有元素都以100%的概率已知时,才知道nlogn解决方案,但在这种情况下,每个位置都有两个候选。哦,对于这个问题,你确定有O(n2)解决方案吗?我认为有2种长度(a)不同的组合。如果你有这样一种方法,你能解释它是什么吗?总共有C(n,2)=O(n^2)个可能的对。其中我只需要检查那些Ix
a1的值。。一个
p1。。pn
,它不可能总是
((n^2)-(n))/4
。例如,在所有
i
a[i]==i
p[i]==1
的情况下,由于数组按概率1排序,因此预期的反转数为0。我假设你回答的问题类似于“在一个无序数组中预期的反转数是多少”,但这个数组不是无序的。哦,我似乎误解了这个问题。我认为数组是随机生成的。很抱歉我的回答有误导性。我应该根据什么来分配权重?我如何对元素不是100%概率预先确定的数组进行排序。你能进一步阐述你的观点吗?@AbhinavChauhan:重读最后一段——你创建了一个不同的数组来运行加权反转计数算法。请告诉我一件事……我们创建了另一个数组B,对于a中的每个位置“i”,我们在B中放置两个元素ai和(ai+x),并为它们分配权重pi和(1-pi)现在我们有了一个数组B。元素ei出现在B中的概率等于ei的权重。但是e1(=a[1])和e2(=a[1]+x)不能在a中同时发生。因此,对应于e1和e2发生的两个事件不是独立的。但是您建议的解决方案(正确的)假定所有元素的发生事件都是相互独立的。为什么??@AbhinavChauhan:如果我正确理解你的担忧,这应该是好的,因为期望的线性(E(X+Y)=E(X)+E(Y))。