免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6948 | 回复: 4
打印 上一主题 下一主题

[算法] 编程之美里面的计算字符串相似度的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-08 20:51 |只看该作者 |倒序浏览
自己把代码输入进去了,发现结果不对呀,代码如下
  1. #include <string>
  2. #include <iostream>
  3. using namespace std;
  4. int minValue(int &v1,int &v2, int &v3)
  5. {
  6.         int temp;
  7.         if ( v1 > v2 )
  8.                 temp = v2;
  9.         else
  10.                 temp = v1;
  11.         if (temp > v3)
  12.                 return v3;
  13.         else
  14.                 return temp;
  15. }

  16. int calstrdist(string strA, int pABegin, int pAEnd, string strB, int pBBegin, int pBEnd)
  17. {
  18.         if (pABegin > pAEnd)
  19.                 {
  20.                         if (pBBegin > pBEnd )
  21.                                 return 0;
  22.                         else
  23.                                 return pBEnd-pBBegin+1;
  24.                 }
  25.         if (pBBegin > pBEnd )
  26.                 {
  27.                         if ( pABegin > pAEnd)
  28.                                 return 0;
  29.                         else
  30.                                 return pAEnd-pABegin+1;
  31.                 }
  32.         if ( strA[pABegin] == strB[pBBegin])
  33.                 return calstrdist(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);
  34.         else
  35.                 {
  36.                         int t1 = calstrdist( strA, pABegin+1, pAEnd, strB, pBBegin+2, pBEnd);
  37.                         int t2 = calstrdist( strA, pABegin+2, pAEnd, strB, pBBegin+1, pBEnd);
  38.                         int t3 = calstrdist( strA, pABegin+2, pAEnd, strB, pBBegin+2, pBEnd);

  39.                         return minValue(t1,t2,t3)+1;
  40.                 }
  41. }
  42. int main()
  43. {
  44.         string strA("123456");
  45.         string strB("abcd");
  46.         int dist = calstrdist(strA,0,strA.length()-1,strB,0,strB.length()-1);
  47.         cout<<dist<<endl;
  48. }
复制代码
预期输出6,但是测试结果是3,不知道为什么呢..

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2013-08-09 00:50 |只看该作者
相似度有什么用?

论坛徽章:
1
技术图书徽章
日期:2013-09-09 13:47:26
3 [报告]
发表于 2013-08-09 11:25 |只看该作者
比如:

论坛徽章:
0
4 [报告]
发表于 2013-08-30 13:42 |只看该作者
  1. /**
  2. *两个字符串,通过删除/添加/修改变为相同的字符串的最少操作
  3. *字符串距离就是:操作+1
  4. *字符串的相似度为(1/操作+1)
  5. * */
  6. #include <iostream>
  7. #include <chrono>
  8. using namespace std;
  9. using namespace std::chrono;

  10. int get_distance(char* left,int l_begin,int l_end,
  11.                 char* right,int r_begin,int r_end)
  12. {
  13.         if(l_begin>=l_end)
  14.         {
  15.                 if(r_begin>=r_end)
  16.                         return 0;
  17.                 else
  18.                         return r_end-r_begin;
  19.         }
  20.         if(r_begin>=r_end)
  21.         {
  22.                 if(l_begin>=l_end)
  23.                         return 0;
  24.                 else
  25.                         return l_end-l_begin;
  26.         }
  27.         if(left[l_begin]==right[r_begin])
  28.                 return get_distance(left,l_begin+1,l_end,
  29.                                 right,r_begin+1,r_end);
  30.         else
  31.         {
  32.                 int op1=get_distance(left,l_begin+1,l_end,
  33.                                 right,r_begin+1,r_end);
  34.                 int op2=get_distance(left,l_begin,l_end,
  35.                                 right,r_begin+1,r_end);
  36.                 int op3=get_distance(left,l_begin+1,l_end,
  37.                                 right,r_begin,r_end);
  38.                 int sum=[&]()
  39.                 {
  40.                         int mid;
  41.                         if(op1>=op2)
  42.                                 mid=op2;
  43.                         else
  44.                                 mid=op1;
  45.                         if(mid>op3)
  46.                                 mid=op3;
  47.                         return mid+1;
  48.                 }();
  49.                 return sum;
  50.         }
  51. }

  52. int** new_matrix(int l,int r)
  53. {
  54.         int** ptr=new int*[l];
  55.         for(int i=0;i<l;++i)
  56.         {
  57.                 ptr[i]=new int[r];
  58.                 for(int j=0;j<r;++j)
  59.                 {
  60.                         ptr[i][j]=-1;
  61.                 }
  62.         }
  63.         return ptr;
  64. }

  65. void delete_matrix(int** ptr,int l)
  66. {
  67.         for(int i=0;i<l;++i)
  68.                 delete[] ptr[i];
  69.         delete[] ptr;
  70. }

  71. int get_distance_state(char* left,int l_begin,int l_end,
  72.                 char* right,int r_begin,int r_end,int** state)
  73. {

  74.         if(state[l_begin][r_begin]!=-1)
  75.                 return state[l_begin][r_begin];

  76.         if(l_begin>=l_end)
  77.         {
  78.                 if(r_begin>=r_end)
  79.                 {
  80.                         state[l_begin][r_begin]=0;
  81.                         return 0;
  82.                 }
  83.                 else
  84.                 {
  85.                         int dis=r_end-r_begin;
  86.                         state[l_begin][r_begin]=dis;
  87.                         return dis;
  88.                 }
  89.         }
  90.         if(r_begin>=r_end)
  91.         {
  92.                 if(l_begin>=l_end)
  93.                 {
  94.                         state[l_begin][r_begin]=0;
  95.                         return 0;
  96.                 }
  97.                 else
  98.                 {
  99.                         int dis= l_end-l_begin;
  100.                         state[l_begin][r_begin]=dis;
  101.                         return dis;
  102.                 }
  103.         }
  104.         if(left[l_begin]==right[r_begin])
  105.         {
  106.                 int dis=get_distance(left,l_begin+1,l_end,
  107.                                 right,r_begin+1,r_end);
  108.                 state[l_begin][r_begin]=dis;
  109.                 return dis;
  110.         }
  111.         else
  112.         {
  113.                 int op1=get_distance(left,l_begin+1,l_end,
  114.                                 right,r_begin+1,r_end);
  115.                 int op2=get_distance(left,l_begin,l_end,
  116.                                 right,r_begin+1,r_end);
  117.                 int op3=get_distance(left,l_begin+1,l_end,
  118.                                 right,r_begin,r_end);
  119.                 int sum=[&]()
  120.                 {
  121.                         int mid;
  122.                         if(op1>=op2)
  123.                                 mid=op2;
  124.                         else
  125.                                 mid=op1;
  126.                         if(mid>op3)
  127.                                 mid=op3;
  128.                         return mid+1;
  129.                 }();
  130.                 state[l_begin][r_begin]=sum;
  131.                 return sum;
  132.         }
  133. }

  134. int main(int argc,char* argv[])
  135. {
  136.         char left[]={"123456"};
  137.         char right[]={"abcd"};
  138.        
  139.         int** state=new_matrix(sizeof(left)/sizeof(char),
  140.                         sizeof(right)/sizeof(char));
  141.         int dis=get_distance_state(left,0,sizeof(left)/sizeof(char),
  142.                         right,0,sizeof(right)/sizeof(char),state);
  143.         cout<<"with state: "<<dis<<endl;
  144.         delete_matrix(state,sizeof(left)/sizeof(char));
  145. }
复制代码
楼主代码有问题吧?!
以上是我的代码
  1. g++ -g -Wall -std=c++11 str_sim.cpp
  2. ./a.out
复制代码
  1. with state: 6
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-08-30 13:44 |只看该作者
上面代码有些地方为了练习一下C++11,胡乱使用的
大家忽略不计!
结果是没问题的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP