计算字符串的相似度 结构之法 3

本文介绍了一个算法,用于计算两个字符串的相似度。通过定义三种基本操作:修改、增加和删除字符,来衡量两个字符串间的距离,并据此计算它们的相似度。

   我们的目的在于判断字符串的相似程度。我们定义了一套操作方法来把两个不同的字符串变得相同,具体的操作方法为:

1、修改一个字符(如吧“a”替换为“b”);

2、增加一个字符(如把“abdd”变为“aebdd”);

3、删除一个字符(如把“travelling”变为“traveling”)。

比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。上面的两种方案,都仅需要一次操作。把这个操作所需要的次数定义为两个字符串的距离,而相似程度等于“距离+1”的倒数。也就是说,“abcdefg”和“abcdef”的距离为1,相似度为1/2=0.5。

    给定任意两个字符串,写出一个算法来计算出他们的相似度:

        两个字符串的距离肯定不超过他们的长度之和(我们可以通过删除操作把两个串转化为空串)。虽然这个结论对结果没有帮助,但至少可以知道,任意两个字符串的距离都是有限的。

         考虑如何才能把这个问题转化成规模较小的同样的问题。

  1、删除A串中的第一个字符,然后计算A[2,....,lenA]和B[1,....,lenB]的距离。

  2、删除B串中的第一个字符,然后计算A[1,....,lenA]和B[2,....,lenB]的距离。

  3、修改A串的第一个字符为B串的第一个字符,然后计算A[2,....,lenA]和B[2,....,lenB]的距离。

  4、修改B串的第一个字符为A串的第一个字符,然后计算A[2,....,lenA]和B[2,....,lenB]的距离。

  5、增加B串的第一个字符到A串的第一个字符之前,然后计算A[1,....,lenA]和B[2,....,lenB]的距离。

  6、增加A串的第一个字符到B串的第一个字符之前,然后计算A[2,....,lenA]和B[1,....,lenB]的距离。

在这个题目中,可以将上面6个操作合并为:

1、一步操作之后,再将A[2,....,lenA]和B[1,....,lenB]变成相同字符串。

2、一步操作之后,再将A[1,....,lenA]和B[2,....,lenB]变成相同字符串。

3、一步操作之后,再将A[2,....,lenA]和B[2,....,lenB]变成相同字符串。

 

 

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int minValue(int a,int b,int c) //计算3个数中的最小值
{
int tmp=min(a,b);
return min(tmp,c);
}
//计算两个字符串的距离
//最好用动态规划的方法记录下各值,这样就可以避免重复计算的问题,动态规划算法有待进一步实现
int CalculateStringDistance(string strA,int pABegin,int pAEnd, string strB,int pBBegin,int pBEnd)
{
if(pABegin>pAEnd)
{
if(pBBegin>pBEnd) return 0;
else return pBEnd-pBBegin+1;
}
if(pBBegin>pBEnd)
{
if(pABegin>pAEnd) return 0;
else return pAEnd-pABegin+1;
}
if(strA[pABegin]==strB[pBBegin])
{
return CalculateStringDistance(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);
}
else
{
int t1=CalculateStringDistance(strA,pABegin+1,pAEnd,strB,pBBegin,pBEnd);
int t2=CalculateStringDistance(strA,pABegin,pAEnd,strB,pBBegin+1,pBEnd);
int t3=CalculateStringDistance(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);
return minValue(t1,t2,t3)+1;
}
}


int main()
{
string str1,str2;
cout<<"请输入两个字符串"<<endl;
cin>>str1>>str2;
int a,b;
a=str1.size();
b=str2.size();
cout<<"a=="<<a<<endl;
cout<<"b=="<<b<<endl;
cout<<"两字符串的距离为:"<<CalculateStringDistance(str1,0,a,str2,0,b);
return 0;
}

个人觉得这个跟算法中的求两个序列的最长公共子序列有点像。  

转载于:https://www.cnblogs.com/zdblog/p/3664902.html

一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值