You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++字符串匹配:暴力算法为何比KMP算法更快?求问题排查

KMP算法性能远低于暴力匹配的问题排查求助

我实现了暴力匹配(Brute Force)算法和Knuth–Morris–Pratt(KMP)算法,测试执行耗时后发现:暴力算法耗时2秒,KMP算法却需要12秒;更换其他随机文本测试,两者的耗时差距依然没有改变。按理论KMP算法应快于暴力匹配,因此推测我的KMP实现存在错误,现寻求帮助排查性能低下的原因。

暴力算法代码

bool Does_full_pattern_match(const string& full_tekst, const string& pattern, const int& index_of_first_match)
{
    if (full_tekst != "" && pattern != "" && index_of_first_match >= 0)
    {
        for (int i = 0; i < (int)pattern.length(); i++)
        {
            if (pattern[i] != full_tekst[index_of_first_match + i]) return false;
        }
        return true;
    }
    else return false;
}
int* Brute_Force_Approach_returns_table_of_index(const string& full_tekst, const string& pattern, int& size)
{
    if (pattern != "")
    {
        Queue<int> obj;
                
        int length = full_tekst.length();
        
        for (int i = 0; i < length; i++)
        {
            if ((full_tekst[i] == pattern[0]) && Does_full_pattern_match(full_tekst, pattern, i))
            {                   
                obj.Enque(i);
            }
        }       

        return obj.Return_Tab(size);
    }
    else return nullptr;
}

KMP算法代码

注:已确认Queue对象和Morrisa_Pratta_Tab_Generator函数无问题,并非性能瓶颈。

int Return_Index_Of_Missmatch(const string& full_tekst, const string& pattern, const int& limit, const int& pattern_size, const int& index_in_tekst)
{
    if (full_tekst == "" || pattern == "" || index_in_tekst < 0) return -2;
    else
    {       
        for (int i = 0; i < pattern_size && index_in_tekst + i < limit; i++)
        {
            if (pattern[i] != full_tekst[index_in_tekst + i]) return i;
        }
        return -1;
    }
}
int* KMP(const string& full_tekst, const string& pattern, int& size_of_returned_tab)
{
    
    int length = (int)full_tekst.length();
    int pattern_size = (int)pattern.length();
        
    int size = 0;
    int* prefix_table = Morrisa_Pratta_Tab_Generator(pattern, size);
    for (int i = 0; i < size; i++) prefix_table[i]++;   
    
    Queue<int> found_match_index;
    
    int result;
    for (int i = 0; i < length; )
    {
        result = Return_Index_Of_Missmatch(full_tekst, pattern, length, pattern_size, i);

        if (0 <= result)
        {
            i += prefix_table[result];
        }
        else if (result == -1) // found match
        {
            found_match_index.Enque(i);
            i += pattern_size;
        }
    }
    
    return found_match_index.Return_Tab(size_of_returned_tab);
}

内容的提问来源于stack exchange,提问作者Enigma24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:55:25