我有两个二进制数组,一个大小为34(模式),另一个大小为10000(目标)。 我想看看是否有任何模式在目标与阈值(如最多4个不匹配) 和返回匹配数(没有重叠发生,如果一个匹配,然后下一个匹配将远离800个单元格)。 我知道这是一种近似匹配问题,但我不知道使用哪种算法具有最佳性能。我做了什么至今:(方法LIKE2具有更好的性能)比较两个二进制数组与阈值(近似匹配)
void compare (bool *target, int t, bool * pattern , int p , int threshold)
{
for(int i =0;i<t-p;i++){
if(like(target+i,pattern,p,threshold)){
return true;
}
}
return false;
}
void like2(bool *target, bool * pattern , int p , int threshold){
int k =0;
for(int i =0;i<p, ;i++){
k+= target[i]^pattern [i];
}
return (k<=threshold);
}
void like(bool *target, bool * pattern , int p , int threshold){
int k =threshold;
for(int i =0;i<p,k>=0 ;i++){
if(target[i]!=pattern[i]){
--k;
}
}
return (k >=0);
}
我试过用字符串匹配算法,如克努特莫里斯普拉特算法,但它们是精确匹配,并改变它们近似匹配算法是一个很难的方法。
当'k'已经超过阈值时加入提前返回 – timrau
它不会提高性能! – abdolahS
@abdolahS你是什么意思,如果有一场(接近)比赛,那么下一场比赛至少会有800“小格”?你是否贪婪地从左到右搜索大串中的(接近)比赛,然后如果你找到一个,那么你在大串中向右移动800个位置来寻找下一个接近的匹配? – user2566092