//树形结构的相似度
public static double three(String x,String y){
if (x==null||y==null){
return 0.0;
}
String[] t = x.split("-");
String[] w = y.split("-");
double arr[]=new double[4];
int max = Math.max(t.length, w.length);
if (!t[0].equals(w[0])){
return 0;
}
//正对不同深度的树做不同的处理
switch (max){
case 1:
arr[0]=1;
break;
case 2:
arr[0]=0.5;arr[1]=1;
break;
case 3:
arr[0]=0.3;arr[1]=0.6; arr[2]=1;
break;
case 4:
arr[0]=0.1; arr[1]=0.3; arr[2]=0.6; arr[3]=1;
break;
}
double a=0;
for (int i = 0; i < t.length && i < w.length; i++) {
if (!t[i].equals(w[i])){
return a;
}else {
a=arr[i];
}
}
return a;
}
/**
* 计算两个字符串的相识度 动态规划
* @param str1
* @param str2
* @return
*/
public static float similarity(String str1, String str2) {
if (str1==null||str2==null){
return 0;
}
//计算两个字符串的长度。
int len1 = str1.length();
int len2 = str2.length();
//建立数组,比字符长度大一个空间
int[][] dif = new int[len1 + 1][len2 + 1];
//赋初值,步骤B。
for (int a = 0; a <= len1; a++) {
dif[a][0] = a;
}
for (int a = 0; a <= len2; a++) {
dif[0][a] = a;
}
//计算两个字符是否一样,计算左上的值
int temp;
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
temp = 0;
} else {
temp = 1;
}
//取三个值中最小的
dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,
dif[i - 1][j] + 1);
}
}
return 1 - (float) dif[len1][len2] / Math.max(str1.length(), str2.length());
}
//得到最小值
public static int min(int... is) {
int min = Integer.MAX_VALUE;
for (int i : is) {
if (min > i) {
min = i;
}
}
return min;
}
//计算两个数的相识度
//原理就是tan的反函数
public static double similarity(double x,double y){
double w=0.022222222;
double max = Math.max(x, y);
double min=Math.min(x,y);
double i = max / min;
double v =Math.toDegrees( Math.atan(i));
//System.out.println((v-45)*w);
double t=1-((v-45)*w);
// System.out.println(v);
return t;
}