java 算字符串 数字 树形结构的相似度

//树形结构的相似度

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;

    }

你可能感兴趣的:(java 算字符串 数字 树形结构的相似度)