繁体   English   中英

如何计算半随机整数数组中的“预期”反转次数?

[英]How to calculate “expected” number of inversions in a semi-random array of integers?

考虑一个整数数组a。 如果i <j且A [i]> A [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平方更好的方法。 请告诉我。

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

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

我留下了一个解释这个问题的评论,但如果你只是使用一点点数学,你就可以对其进行O(1)计算。 我会省去你的工作,但是,根据我的计算,n个整数数组中预期的反转次数是((n ^ 2) - (n))/ 4.对不起,括号中有很多,我只是想要确保完全清楚。 如果你愿意,我可以发布你的工作,但我想如果你只是需要答案,我会把它留下来。

所以,尽管我的评论说,我记得错了。 这不是lg(n)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM