Boyer-Moore


#include<stdio.h>
#include<string.h>
//unsigned short jump(char c);
int search(char*, char*);
int char_index(char,char*);
int main(void)
{
//char* pattern = "norn";
//char* pattern = "grow";
//char* pattern = "corn";
char* pattern = "door to door";
//char* target = "okas from acornorn grow";
char* target = "he went door to door";
printf("%s\n",search(pattern,target)?"find":"not find");
return 0;
}

int char_index(char c, char* pattern)
{
char* tmp = pattern;
while(*tmp){
if(*tmp == c){
return tmp-pattern+1;
}
tmp++;
}
return 0;
}

/**
* Boyer-Moore fast string searching algorithm
*/
int search(char* pattern, char* target)
{
int len = strlen(pattern);
//int jump = 0;
// 如果cur指向的字符不等于pattern的最后一个字符,则cur右移pattern的长度个字符
while(*cur){ // 如果cur指向的字符等于pattern的最后一个字符,那么依次比较cur-1和pattern的倒数第二个字符,
// 如果仍然相同,依次类推,如果pattern中的字符全部被匹配,那么匹配成功
if(*cur != pattern[len-1]){ // 如果迭代过程中出现字符不匹配的情况,那cur指针么依据被查找串中不匹配的字符在pattern中的位置移动
cur += (len-char_index(*cur, pattern)); // 如果被查找串中不匹配的字符不在pattern中,那么cur移动pattern的长度个位置
}else{ // 如果被查找串中不匹配的字符在pattern中,那么cur先指向该字符,然后移动的距离 = 该字符在pattern中的位置到pattern末尾的距离
int i = 1;
printf("\n%c",*cur);
while(1){
//字符在pattern中的位置到pattern末尾的距离 == 被查找串移动的距离
if(*(cur-i) == pattern[len-1-i]){
printf("%c",*(cur-i));

if(i++ == len-1){
printf("\n");
printf("from position %d\n", cur-target-(len-1));
return 1;
}
}else{
cur -= i;
break;
}
}
}
}
return 0;
}

### Boyer-Moore算法的原理 Boyer-Moore算法是一种高效的字符串匹配算法,其核心思想是通过预处理模式串,利用字符比较的不匹配信息来跳过尽可能多的目标字符,从而快速定位可能的匹配位置[^5]。该算法采用“从右到左”的匹配策略,并结合了坏字符规则和好后缀规则来减少不必要的比较[^2]。 #### 坏字符规则 坏字符规则指的是当模式串中的某个字符与文本串中的字符不匹配时,根据不匹配字符在模式串中的位置调整模式串的偏移量。如果文本串中的字符在模式串中不存在,则模式串可以跳过该字符的距离;如果存在,则跳到该字符最后一次出现的位置之后[^3]。 #### 好后缀规则 好后缀规则是指当模式串的某一部分已经匹配成功,但由于后续字符不匹配导致失败时,可以根据已匹配部分(即好后缀)的信息调整模式串的偏移量。这种规则通常需要对模式串进行预处理以生成一个表,用于指示在不同情况下应如何移动模式串[^4]。 ```python def boyer_moore_search(text, pattern): def bad_char_heuristic(pattern, size): bad_char = [-1] * 256 for i in range(size): bad_char[ord(pattern[i])] = i return bad_char m = len(pattern) n = len(text) bad_char = bad_char_heuristic(pattern, m) s = 0 while s <= n - m: j = m - 1 while j >= 0 and pattern[j] == text[s + j]: j -= 1 if j < 0: return s else: shift = max(1, j - bad_char[ord(text[s + j])]) s += shift return -1 ``` ### 性能优化方法 为了适应大规模数据处理,Boyer-Moore算法可以通过以下几种方式进行优化: 1. **并行化处理**:将文本分割成多个子段,每个子段独立应用Boyer-Moore算法进行搜索,最后合并结果。这种方法可以充分利用现代多核处理器的优势[^1]。 2. **使用更高效的数据结构**:对于坏字符规则和好后缀规则中的查找操作,可以采用哈希表或树状结构来加速查询过程[^3]。 3. **简化规则**:例如,Boyer-Moore-Horspool算法仅使用坏字符规则,虽然牺牲了一定的性能,但其实现更加简单,在某些场景下仍然能够提供良好的性能[^4]。 4. **动态调整规则**:根据模式串的具体特征动态选择是否启用好后缀规则,避免不必要的计算开销。 ### 示例代码优化 以下是一个经过优化的Boyer-Moore算法实现,结合了坏字符规则和简化版的好后缀规则: ```python def boyer_moore_optimized(text, pattern): def preprocess_pattern(pattern): bad_char = {} for i, char in enumerate(pattern): bad_char[char] = i return bad_char bad_char = preprocess_pattern(pattern) m = len(pattern) n = len(text) s = 0 while s <= n - m: j = m - 1 while j >= 0 and pattern[j] == text[s + j]: j -= 1 if j < 0: return s else: char = text[s + j] shift = j - bad_char.get(char, -1) s += max(shift, 1) return -1 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值