KMP

简介: 【7月更文挑战第7天】

KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种高效的字符串搜索(或模式匹配)算法。它由Donald Knuth、Vaughan Pratt和James H. Morris共同发明,能够快速地在一个文本串(text)中查找一个模式串(pattern),特别是在模式串较长或在一个文本串中多次查找时。

KMP算法的特点:

  1. 单次预处理:KMP算法首先对模式串进行一次预处理,构建一个部分匹配表(也称为"前缀函数"或"失配表"),用于在搜索过程中遇到不匹配的情况时确定下一步的搜索位置。
  2. 线性时间复杂度:在最坏的情况下,KMP算法的时间复杂度为O(n+m),其中n是文本串的长度,m是模式串的长度。
  3. 无回溯:与简单的回溯字符串搜索算法(如朴素算法)不同,KMP算法不会在文本串中来回移动,因此效率更高。

KMP算法的基本步骤:

  1. 预处理模式串:构建部分匹配表。
  2. 搜索:使用部分匹配表在文本串中搜索模式串。

代码使用示例:

以下是KMP算法的一个简单Python实现:

def kmp_search(text, pattern):
    # 预处理模式串,构建部分匹配表
    def compute_lps(pattern):
        length = 0  # length of the previous longest prefix suffix
        lps = [0] * len(pattern)  # lps[0] is always 0
        i = 1
        while i < len(pattern):
            if pattern[i] == pattern[length]:
                length += 1
                lps[i] = length
                i += 1
            else:
                if length != 0:
                    length = lps[length - 1]
                else:
                    lps[i] = 0
                    i += 1
        return lps

    lps = compute_lps(pattern)
    i = j = 0  # i是text的索引,j是pattern的索引
    while i < len(text):
        if pattern[j] == text[i]:
            i += 1
            j += 1
        if j == len(pattern):
            print(f"Pattern found at index {i - j}")
            j = lps[j - 1]  # 继续搜索下一次出现
        elif i < len(text) and pattern[j] != text[i]:
            if j != 0:
                j = lps[j - 1]  # 根据部分匹配表移动j
            else:
                i += 1

# 示例使用
text = "ABABDABACDABABCABAB"
pattern = "ABABCABAB"
kmp_search(text, pattern)
目录
相关文章
|
人工智能 自然语言处理 算法
【LLMOps】AIGC使用场景解决方案
【4月更文挑战第10天】AIGC五大使用场景解决方案
585 2
【LLMOps】AIGC使用场景解决方案
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
基于迁移学习的智能代理在多领域任务中的泛化能力探索
近年来,AI Agent(人工智能代理)已广泛应用于自然语言处理、推荐系统、金融决策、游戏博弈等领域。然而,在面临“跨领域任务”时,AI Agent往往面临数据稀缺、训练代价高、泛化能力差等问题。 而迁移学习(Transfer Learning)的提出,为AI Agent提供了跨领域适配的技术支撑。通过将一个领域中训练好的知识迁移到另一个领域,我们可以显著减少新任务所需数据量,提高模型收敛速度与泛化性能。 本文将从理论、架构设计、代码实战与跨领域实验四方面,探讨迁移学习如何增强AI Agent在多个领域间的通用能力。
基于迁移学习的智能代理在多领域任务中的泛化能力探索
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】30. 神经网络中批量归一化层(batch normalization)的作用及其Pytorch实现
【从零开始学习深度学习】30. 神经网络中批量归一化层(batch normalization)的作用及其Pytorch实现
|
存储 索引 Python
深度解密 Python 列表的实现原理
深度解密 Python 列表的实现原理
370 14
|
网络协议
Mac根据端口查询进程id的命令
这篇文章介绍了在Mac操作系统上如何使用两种命令来查询监听特定端口的进程ID。第一种方法是使用`netstat -anp tcp -v | grep 端口号`,例如`netstat -anp tcp -v | grep 80`,这将列出所有使用端口80的TCP连接及其相关信息。第二种方法是使用`lsof -P -n -i:端口号`,例如`lsof -P -n -i:8080`,这将显示使用指定端口的进程列表,包括进程ID、用户、文件描述符等信息。文章通过示例展示了如何使用这些命令,并提供了输出结果的截图。
1316 2
|
C++ 索引 Python
Python 字典dict详解(超详细)
Python 字典dict详解(超详细)
932 0
|
边缘计算 人工智能 数据处理
大模型能否通往AGI?
【2月更文挑战第29天】复旦大学张奇教授探讨大模型与人工通用智能(AGI)关系,指出大模型研发需大量资源,企业成为推动力,强调中国应加强自主创新。新书《大规模语言模型:从理论到实践》探讨合作模式及技术细节。张教授认为大模型处理多模态信息有挑战, Scaling Law存在争议,小模型在特定场景有优势。目前大模型尚未达到AGI的推理能力,实现商业化需平衡成本与收益。他通过项目展示大模型的社会应用潜力。
1067 1
大模型能否通往AGI?
|
存储 NoSQL Ubuntu
如何安装和使用 Redis
如何安装和使用 Redis
225 0
|
机器学习/深度学习 数据挖掘 Linux
如何在Python中使用虚拟环境管理依赖
当在Python中开发项目时,使用虚拟环境来管理依赖是一种良好的实践,可以隔离不同项目的依赖关系,避免冲突,并确保项目的稳定性。

热门文章

最新文章