有没有一种方法可以衡量列表的排序方式?
我的意思是,这不是要知道列表是否已排序(布尔值),而是诸如“排序”之比,诸如统计中的相关系数之类的东西。
例如,
如果列表中的项目按升序排列,则其比率为1.0
如果列表降序排列,则其速率将为-1.0
如果list几乎升序排列,则其比率将是0.9或接近1的某个值。
如果列表根本不排序(随机),则其比率将接近0
我正在Scala中写一个小型图书馆进行练习。我认为排序速率会很有用,但是我找不到有关此类信息的任何信息。也许我不知道这个概念的适当术语。
您可以简单地计算列表中的反转次数。
类型的元素序列中的一个反转T
是一对序列元素,它们根据<
的集合上的某些顺序乱序出现T
。
从维基百科:
正式地,让数字
A(1), A(2), ..., A(n)
序列n
。
如果i < j
和A(i) > A(j)
,然后在一对(i,j)
被称为反转的A
。的反转数的序列的是它的有序性的一个公共量度。
形式上,将反转数定义为反转数,即
为了使这些定义更清楚,请考虑示例序列9, 5, 7, 6
。该序列具有反演 (0,1), (0,2), (0,3), (2,3)
和反演编号 4
。
如果您想要介于0
和之间的值1
,则可以将反转数除以N choose 2
。
要实际创建一种算法来计算此分数对列表的排序方式,您有两种方法:
修改您喜欢的排序算法,以跟踪其运行时正在纠正的反转次数。尽管这是不平凡的,并且根据您选择的排序算法有不同的实现方式,但最终您得到的算法(就复杂性而言)不会比开始时使用的排序算法昂贵。
如果您采用这种方法,请注意,这并不像计算“掉期”那么简单。例如,Mergesort是最坏的情况O(N log N)
,但是如果它在以降序排列的列表上运行,它将纠正所有N choose 2
反转。O(N^2)
在O(N log N)
操作中纠正了这种反转。因此,某些操作不可避免地必须一次校正多个反转。您必须小心执行。注意:您可以非常O(N log N)
复杂地完成此操作,这很棘手。
相关:计算排列中的“反转”数
(i,j)
,其中i != j
list[min(i,j)] < list[max(i,j)]
(0还是1)N choose 2
除非您对准确性有要求,否则我个人会采用随机方法-仅仅是因为它是如此容易实现。
如果您真正想要的是(降序排列)到(升序排列z'
)之间的值(),则可以使用此公式将(升序)和(降序排列)之间的()以上的值映射到该范围:-1
1
z
0
1
z' = -2 * z + 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句