背景
这里主要讲我对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 > 1 | Y |
| (3,2) | 3 > 2 | Y |
| (3,5) | 3 < 5 | |
| (4,1) | 4 > 1 | Y |
| (4,2) | 4 > 2 | Y |
| (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