legongju.com
我们一直在努力
2025-01-10 22:28 | 星期五

c++ string匹配有哪些性能优化技巧

在 C++ 中,使用 std::string 进行字符串匹配时,可以采用以下性能优化技巧:

  1. KMP 算法(Knuth-Morris-Pratt):这是一种高效的字符串匹配算法,通过预处理模式串来避免不必要的比较。时间复杂度为 O(m+n),其中 m 是模式串长度,n 是文本串长度。

    #include 
    #include 
    #include 
    
    void compute_lps(const std::string& pattern, std::vector& lps) {
        int m = pattern.length();
        int len = 0;
        lps[0] = 0;
    
        int i = 1;
        while (i < m) {
            if (pattern[i] == pattern[len]) {
                len++;
                lps[i] = len;
                i++;
            } else {
                if (len != 0) {
                    len = lps[len - 1];
                } else {
                    lps[i] = 0;
                    i++;
                }
            }
        }
    }
    
    int kmp_search(const std::string& text, const std::string& pattern) {
        int n = text.length();
        int m = pattern.length();
        std::vector lps(m, 0);
        compute_lps(pattern, lps);
    
        int i = 0;
        int j = 0;
        while (i < n) {
            if (text[i] == pattern[j]) {
                i++;
                j++;
            }
    
            if (j == m) {
                std::cout << "Pattern found at index: " << i - j << std::endl;
                j = lps[j - 1];
            } else if (i < n && text[i] != pattern[j]) {
                if (j != 0) {
                    j = lps[j - 1];
                } else {
                    i++;
                }
            }
        }
    
        return -1;
    }
    
    int main() {
        std::string text = "ABABDABACDABABCABAB";
        std::string pattern = "ABABCABAB";
        int result = kmp_search(text, pattern);
        return 0;
    }
    
  2. Boyer-Moore 算法:这是一种高效的字符串搜索算法,通过跳过部分字符来减少比较次数。时间复杂度为 O(n+m),其中 n 是文本串长度,m 是模式串长度。

    #include 
    #include 
    
    int bad_character_heuristic(const std::string& text, const std::string& pattern) {
        int n = text.length();
        int m = pattern.length();
        std::vector last_occurrence(256, -1);
    
        for (int i = 0; i < m; i++) {
            last_occurrence[pattern[i]] = i;
        }
    
        int i = 0;
        int j = 0;
        while (i < n) {
            if (text[i] == pattern[j]) {
                i++;
                j++;
            } else {
                i += std::max(1, j - last_occurrence[text[i]]);
            }
        }
    
        return j == m ? i - j : -1;
    }
    
    int main() {
        std::string text = "ABABDABACDABABCABAB";
        std::string pattern = "ABABCABAB";
        int result = bad_character_heuristic(text, pattern);
        return 0;
    }
    
  3. Rabin-Karp 算法:这是一种基于哈希的字符串匹配算法,通过计算文本串和模式串的哈希值来快速比较它们。时间复杂度为 O(n+m),其中 n 是文本串长度,m 是模式串长度。

    #include 
    #include 
    #include 
    #include 
    
    uint64_t hash_function(const std::string& s, int seed = 131) {
        uint64_t hash_value = https://www.yisu.com/ask/0;"hljs">int rabin_karp_search(const std::string& text, const std::string& pattern) {
        int n = text.length();
        int m = pattern.length();
        if (m > n) {
            return -1;
        }
    
        uint64_t pattern_hash = hash_function(pattern);
        uint64_t text_hash = hash_function(text, pattern_hash);
    
        while (text_hash != pattern_hash) {
            text_hash = (text_hash - hash_function(text[0]) * pattern_hash) + hash_function(text[n - m + 1]);
            n--;
        }
    
        for (int i = 0; i <= n - m; i++) {
            if (text.substr(i, m) == pattern) {
                return i;
            }
        }
    
        return -1;
    }
    
    int main() {
        std::string text = "ABABDABACDABABCABAB";
        std::string pattern = "ABABCABAB";
        int result = rabin_karp_search(text, pattern);
        return 0;
    }
    

根据具体应用场景和需求,可以选择合适的字符串匹配算法进行优化。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/80885.html

相关推荐

  • c#数组切片的边界处理

    c#数组切片的边界处理

    在C#中,数组切片是通过指定起始索引和结束索引来获取数组的一部分。为了正确处理边界情况,需要注意以下几点: 起始索引和结束索引应该在数组的有效范围内。如果...

  • 数组切片在c#数据处理中的应用

    数组切片在c#数据处理中的应用

    在C#中,数组切片是一种从现有数组中创建新数组的方法,新数组包含原始数组的一部分元素
    以下是一个简单的示例,说明如何在C#中使用数组切片:
    using ...

  • c#中数组切片的常见错误

    c#中数组切片的常见错误

    在C#中,数组切片是一种从现有数组中获取子数组的方法。然而,在进行数组切片时,可能会遇到一些常见错误。以下是一些常见的错误及其解决方案: 越界错误(Index...

  • c#数组切片的性能优化

    c#数组切片的性能优化

    在C#中,数组切片(slicing)是指从一个较大的数组中提取一部分元素并将其存储在一个新数组中。这种操作在处理大量数据时可能会影响性能。为了优化数组切片的性能...

  • 如何在c++中实现字符串的子串查找

    如何在c++中实现字符串的子串查找

    在 C++ 中,可以使用 std::string 类的成员函数 find() 来实现字符串的子串查找。
    find() 函数的原型如下:
    size_t find(const std::string& str, siz...

  • c++ string匹配如何支持正则表达式

    c++ string匹配如何支持正则表达式

    C++的库支持正则表达式。你可以使用std::regex类来创建一个正则表达式对象,然后使用它的成员函数来执行匹配操作。
    下面是一个简单的示例,演示如何使用C++...

  • 怎样处理c++ string匹配中的大小写问题

    怎样处理c++ string匹配中的大小写问题

    在C++中处理string匹配中的大小写问题时,可以采用以下几种方法: 使用标准库函数 tolower 函数将字符串转换为全小写或全大写。
    #include #include std::st...

  • c++ string匹配怎样提高效率

    c++ string匹配怎样提高效率

    在C++中,使用string进行匹配时,有几种方法可以提高效率: 使用find()函数:find()函数是C++标准库中用于在字符串中查找子字符串的函数。它返回子字符串在原字符...