归并排序之Kendall tau距离 (一)

2,080 阅读3分钟

背景

这里主要讲我对kendall tau distance的理解,以及如何把merge sort应用到此场景,如果大家对merge sort的基本概念不熟悉的话建议先了解一下它的工作原理.

在讲kentall tau之前,我先抛出一个问题:如何判断两组排列的相似度.

注意,这里用到的术语是排列,而不是序列或列表.我们知道排列是对同一组数据在位置上的编排,而序列或列表则没有此类约束.

比如,我们可以比较如下两组数据的相似度,因为它们是同一组数据,只是元素位置不同:

3,5,7,12,4,1
7,5,1,4,3,12

此时你可能有疑问,这两组数据除了数一样之外,也没什么规律可言啊? 确实,对于我们不专门做数值分析或搜索引擎结果相似度ranking的开发人员来说,确实不关注这个相似度问题.但我们今天要介绍的是Kendall tau 距离,则绕不过这个问题.其实也很简单,咱们继续往下看.

既然要讨论相似度,总的有个判断标准,否则我们怎么知道它们是否相似或者相似度有多高呢.为了解决这个判断标准的问题,大家思考了很久都没找到合适的答案.就在这时,传来一个略显苍老但铿锵有力的声音:"扶我起来试试",在大家惊异的目光下,肯大爷(kendall)一顿猛烈操作,Kendall tau 距离(以下简称距离)诞生了:

inversions/(n*(n-1))*2

上面这个公式的计算结果就是Kendall tau 距离.我们就是用它来衡量两个排列的相似度.其中,inversions代表逆序对,n代表排列的元素个数.

逆序对

先说一下逆序对,概念也很简单.比如排列3,4,1,2,5,我们怎么求它的逆序对呢,只要把它的任一元素与后面的所有元素进行两两比较,如果后者小于前者,那么这就是一个逆序对

数值对关系逆序
(3,4)3 < 4
(3,1)3 > 1Y
(3,2)3 > 2Y
(3,5)3 < 5
(4,1)4 > 1Y
(4,2)4 > 2Y
(4,5)4 < 5
(1,2)1 < 2
(1,5)1 < 5
(2,5)2 < 5

通过上面的表格可以很容易的得到逆序对的数量是4,即inversion = 4.带入公式可得,该排列对应的Kendall tau 距离4/(5*4)*2 = 0.4.显然,当两个排列完全一致时,距离为0,当两个排列完全相反时,距离为1.也就是说这个距离在[0,1]范围内,而且值越大相似度越低.

讲到这里我们稍微回顾一下上面的过程:

  • 为了解决两个排列相似度的问题,我们引入了距离的概念;
  • 为了计算距离,我们需要知道某个排列的逆序对数量;
  • 通过上面的表格我们也知道了如何计算逆序对的个数;

是不是万事俱备了?答案是NO