//樹形結(jié)構(gòu)的相似度
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;
? ? }
? ? /**
? ? * 計(jì)算兩個(gè)字符串的相識(shí)度 動(dòng)態(tài)規(guī)劃
? ? * @param str1
? ? * @param str2
? ? * @return
? ? */
? ? public static float similarity(String str1, String str2) {
? ? ? ? if (str1==null||str2==null){
? ? ? ? ? ? return? 0;
? ? ? ? }
? ? ? ? //計(jì)算兩個(gè)字符串的長度壶谒。
? ? ? ? int len1 = str1.length();
? ? ? ? int len2 = str2.length();
? ? ? ? //建立數(shù)組克锣,比字符長度大一個(gè)空間
? ? ? ? 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;
? ? ? ? }
? ? ? ? //計(jì)算兩個(gè)字符是否一樣秆吵,計(jì)算左上的值
? ? ? ? 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;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //取三個(gè)值中最小的
? ? ? ? ? ? ? ? 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;
? ? }
? ? //計(jì)算兩個(gè)數(shù)的相識(shí)度
????//原理就是tan的反函數(shù)
? ? 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;
? ? }