字符串匹配(二)——逆向思维 BMH

BMH算法

BMH(Boyer-Moore-Horspool)算法是BM(Boyer-Moore)算法的一种优化,P从最右边开始比较
核心:焦点在于坏字符上,根据字符在模式串P中出现的最后的位置算出偏移长度,偏移模式串的长度。

坏字符偏移表

在预处理中,计算大小为|∑|的偏移表。
设m为P串的长度:
字符在P模式串中 **bmBc[char] = m-1-max **
↗ (max为字符在P的最大位置,对于P串最后一个字符,若此前出现过则保留原值,否则偏移值为m)

字符不在P模式串中 bmBc[char] = m
例如:
P = “GTTAC” ,m = 5
bmBc[T] = 5 - 1 - max(T的位置) = 5 - 1 - 2 = 2
bmBc[C] = 5(C只在最后一个位置出现过,所以直接取长度m)
bmBc[U] = 5(U ∉ P)

计算可知偏移表如下:

字符GTAC其他
偏移量42155

P为短串(模式串),T为长串(目标串)

  1. a中短串从‘C’往左比较,在长串‘T’字符位置失配,此时应从长串里已完成匹配的子串中找到最右端字符,本例为‘C’,查表可知C的偏移量为5,短串右移五格。
  2. b图中首字符失配,且U在短串未出现过,短串右移五格。
  3. c图长串首字符‘T’失配,T的偏移量为2,短串右移两格。
  4. 最后一轮正好完全匹配。
    在这里插入图片描述
#include<bits/stdc++.h>
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxchar = 256; 
void preBMH(const char* patt, int m, int bmBc[]) {
  int k = 0;
  for (k = 0; k < maxchar; k++) 
    bmBc[k] = m;
  /*m-1是为了考虑最后的字符在之前是否已有的情况,
  若没有则直接继承上面循环的m,若有就在本次循环更新*/ 
  for (k = 0; k < m-1; k++)
    bmBc[patt[k]] = m-k-1;
}
int BMH (string p, string t) {
  int m = p.length();
  int n = t.length();
  if (m > n) {
    cout << "find fail" <<endl;
    return -1;
  }
  int bmBc[maxchar];
  const char* patt = p.c_str();
  const char* text = t.c_str();
  preBMH(patt, m, bmBc);
  //定在P的最后一个字符 
  int k = m-1;
  while (k < n) {
    //j为p串,i为目标串 
    int j = m-1;
    int i = k;
    //从最右向左比较 
    while (j >= 0 && text[i] == patt[j]) {
      j--;
      i--;
    }
    //P全部匹配时i+1才为P的首字符index 
    if (j == -1) 
      return i+1; 
    //偏移量看的是目标串已完成匹配的子串中最右端字符!!
    k += bmBc[text[k]]; 
  }
}
int main() {
  fio
  string t = "GCCTCATCCUACGTTAC";
  string p = "GTTAC";
  int ans = BMH(p, t);
  cout << ans << endl; 
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
改进的BM立体匹配算法是对经典BM算法的改进,旨在提高匹配的效率和准确性。BM算法(Boyer-Moore算法)是一种模式匹配算法,广泛应用于数字通信、入侵检测等领域。然而,虽然BM算法已经被广泛应用,但其效率仍然可以进一步提高。 改进的BM立体匹配算法(BMH)是在经典BM算法的基础上进行了优化。BMH算法采用了一些改进措施,以提高匹配的速度和准确性。例如,BMH算法引入了预处理步骤,利用图像的特性进行快速搜索。此外,BMH算法还采用了分块匹配和匹配代价的快速计算等技术,以进一步加速匹配过程。 BMH算法的实现通常使用编程语言,比如Python,并调用相应的库函数,如OpenCV。通过使用BMH算法,可以计算左右图像之间的视差图,从而实现立体匹配的目标。视差图可以提供左右图像之间的深度信息,对于三维重建等应用非常有用。 综上所述,改进的BM立体匹配算法(BMH)是对经典BM算法的优化,旨在提高匹配的效率和准确性,通过预处理、分块匹配和匹配代价的快速计算等技术,实现了对左右图像的立体匹配,并得到视差图。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [BM模式匹配算法的研究和改进](https://download.csdn.net/download/weixin_38618540/16714403)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [python实现BM匹配算法](https://download.csdn.net/download/memphis147/10935918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你脸上有BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值