Kendall tau距离——逆序对的数量
* *
* kendall tau distance, 求逆序对的数量,求相对于一个
* 数组另一个数组的逆序对的数量, 在基因测序中有大量使用
* @author XY
*
* /
public class Kendalltau {
public static int Kendalltaodist_merge ( int [ ] a, int [ ] b) {
if ( a. length == b. length) {
int [ ] test = new int [ a. length] ;
int [ ] aux = new int [ a. length] ;
int [ ] temp = new int [ a. length] ;
for ( int i = 0 ; i < temp. length; i++ ) {
temp[ a[ i] ] = i;
}
for ( int i = 0 ; i < temp. length; i++ ) {
test[ i] = temp[ b[ i] ] ;
}
return count_merge ( test, aux, 0 , a. length - 1 ) ;
}
throw new IllegalArgumentException (
"a.length is not equal with b.length" ) ;
}
public static int Kendalltaodist_insertion ( int [ ] a, int [ ] b) {
if ( a. length == b. length) {
int [ ] test = new int [ a. length] ;
int [ ] temp = new int [ a. length] ;
for ( int i = 0 ; i < temp. length; i++ ) {
temp[ a[ i] ] = i;
}
for ( int i = 0 ; i < temp. length; i++ ) {
test[ i] = temp[ b[ i] ] ;
}
return count_insertion ( test) ;
}
throw new IllegalArgumentException ( "a.length is not equal with b.length" ) ;
}
private static int count_merge ( int [ ] src, int [ ] aux, int lo, int hi) {
if ( lo >= hi)
return 0 ;
int inversion = 0 ;
int mid = ( lo + hi) / 2 ;
inversion += count_merge ( src, aux, lo, mid) ;
inversion += count_merge ( src, aux, mid + 1 , hi) ;
inversion += merge ( src, aux, lo, mid, hi) ;
return inversion;
}
private static int merge ( int [ ] src, int [ ] aux, int lo, int mid, int hi) {
int count = 0 ;
for ( int i = lo; i <= hi; i++ ) {
aux[ i] = src[ i] ;
}
int i = lo;
int j = mid + 1 ;
int k = lo;
while ( k <= hi) {
if ( i > mid)
src[ k++ ] = aux[ j++ ] ;
else if ( j > hi)
src[ k++ ] = aux[ i++ ] ;
else if ( aux[ j] < aux[ i] ) {
src[ k++ ] = aux[ j++ ] ;
count += ( mid + 1 - i) ;
} else {
src[ k++ ] = aux[ i++ ] ;
}
}
return count;
}
private static int count_insertion ( int [ ] a) {
int count= 0 ;
for ( int i = 1 ; i < a. length; i++ ) {
while ( i>= 1 && a[ i] < a[ i- 1 ] ) {
count++ ;
int temp= a[ i] ;
a[ i] = a[ i- 1 ] ;
a[ -- i] = temp;
}
}
return count;
}
public static void main ( String[ ] args) {
System. out. println ( Kendalltaodist_insertion ( new int [ ] { 3 , 1 , 2 , 0 , 4 } ,
new int [ ] { 1 , 0 , 2 , 4 , 3 } ) ) ;
}
}