计算俩个NSString的相似度

最近项目中需要做一个用户通讯录好友和某开放平台的用户名进行相似度匹配,根据动态规划的算法处理了一下大致如下:

//

static inline int min (int a, int b, int c)

{

    int min = a;

    a = b < c ? b : c;

    return min < a ? min : a;

}


/*

 计算相似度,数值越大越相似,最大为1,表示相同,

 */

- (float)sim:(NSString *)str1 str2:(NSString *)str2

{

    int ld = [self ld:str1 str2:str2];

    return 1-(float)ld/(float)MAX(str1.length, str1.length);

}


/*

 *计算距离

 */


- (int)ld:(NSString *)str1 str2:(NSString *)str2

{

    int n = str1.length;

    int m = str2.length;

    if(n == 0) {

        return m;

    }

    if(m == 0) {

        return n;

    }

    

    int d[n+1][m+1];    //矩阵

    

    int i;    //遍历str1

    int j;    //遍历str2

    unichar ch1;    //str1

    unichar ch2;    //str2

    int temp;    //记录相同字符,在某个矩阵位置值的增量,不是0就是1

    

    for(i=0; i<=n; i++) {    //初始化第一列

        d[i][0] = i;

    }

    for(j=0; j<=m; j++) {    //初始化第一行

        d[0][j] = j;

    }

    for(i=1; i<=n; i++) {    //遍历str1

        ch1 = [str1 characterAtIndex:(i-1)];

        //去匹配str2

        for(j=1; j<=m; j++) {

            ch2 = [str2 characterAtIndex:(j-1)];//str2.charAt(j-1);

            if(ch1 == ch2) {

                temp = 0;

            } else {

                temp = 1;

            }

            //左边+1,上边+1,左上角+temp取最小

            d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+temp);

        }

    }

    return d[n][m];

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值