测量阵列的“乱序”

时间:2010-11-18 11:10:46

标签: algorithm

给定一个值数组,我想找到总的“得分”,其中每个元素的得分是在数组之前出现的值较小的元素的数量。

e.g。

values: 4 1 3 2 5
scores: 0 0 1 1 4
total score: 6

O(n ^ 2)算法很简单,但我怀疑通过对数组进行排序可以在O(nlgn)中进行。有没有人有任何想法如何做到这一点,或者如果不可能?

2 个答案:

答案 0 :(得分:5)

看起来你正在做的事实上是计算不正确的相对顺序的元素对的数量(即反转次数)。这可以通过使用与合并排序相同的想法在O(n * log(n))中完成。在合并时,您只需计算左侧列表中的元素数量,但应该在右侧列表中(反之亦然)。

答案 1 :(得分:2)

如果您的数字范围足够小,我能想到的最快算法是使用Fenwick Trees的算法。基本上只是遍历列表并查询Fenwick树中有多少元素,然后将数字插入树中。这将在O(nlogm)中回答您的问题,其中n是列表的大小,m是您的最大整数。

如果你的整数没有合理的范围(或者你想节省空间)MAK的解决方案非常优雅,那么使用:)