考虑一个整数数组。如果i A [j]的。
对于阵列中的每个位置'i',存在两个可能的候选:a [i]具有概率p [i]和a [i] + x具有概率1-p [i]。
现在我必须计算预期的反转次数。 给定每个索引i和整数x的[i]和p [i]。
我知道O(n ^ 2)方法(检查每个合法可能的对)。 此外,我知道O(nlogn)方法来计算数组中的反转次数,其中所有元素都以100%的概率预先确定。这是通过修改合并排序来完成的。
我想知道比n平方更好的方法。请告诉我。
答案 0 :(得分:2)
这可以通过对基于标准合并排序的算法进行简单修改来计算倒数,我们为每个值分配权重并计算W[i]*W[j]
i<j
的总和,{{ 1}}(当每个权重为1时,我们得到正常计数)。我们将这些元素的权重之和乘以我们正在处理的右数组中元素的权重,而不是向计数中添加剩余元素的数量。
要使用此算法解决提出的问题,只需创建一个大小为两倍的数组,其中原始数组中的每个元素都被两个元素(按排序顺序)替换,权重由概率给出。
答案 1 :(得分:0)
我留下了一个解释这个问题的评论,但如果你只是使用一点点数学,你就可以对其进行O(1)计算。我会省去你的工作,但是,根据我的计算,n个整数数组中预期的反转次数是((n ^ 2) - (n))/ 4.对不起,括号中有很多,我只是想要确保完全清楚。如果你愿意的话,我可以发布你的作品,但我想如果你只是需要答案,我会把它留下来。
所以,尽管我的评论说的是,但我记得错了。这不是lg(n)。