当前位置: 首页 > article >正文

【大数据算法】时间亚线性算法之:串相等判定算法。

串相等判定算法

  • 1、引言
  • 2、串相等判定算法
    • 2.1 定义
    • 2.2 核心原理
    • 2.3 应用场景
    • 2.4 算法公式
      • 2.4.1 Rabin-Karp算法
      • 2.4.2 哈希函数
    • 2.5 代码示例
  • 3、总结

1、引言

小屌丝:鱼哥, 啥是串相等判定算法啊
小鱼:这个… en…en…
小屌丝:咋了,这个问题难住你了? 不能吧
小鱼:难住了,难住了, 我现在饿的迷糊了。
小屌丝:我~ 这个真是的。 这时间赶的。
小鱼:要不,先去吃个饭?
小屌丝:行行行,
小鱼:你这是不高兴啊,不乐意啊
小屌丝:没没没, 我这不是笑着吗
在这里插入图片描述
小鱼:行,你笑就行,那咱就走?
小屌丝:行啊,走吧。
小鱼:吃得差不多了,泡个澡去?
小屌丝:鱼哥,你这又…
小鱼:泡泡澡,顺便说说串相等判定算法。
小屌丝:行啊~ ~

2、串相等判定算法

2.1 定义

  • 时间亚线性串相等判定算法:指那些执行时间复杂度低于O(n)的字符串相等性判定算法。
  • 这类算法通过预处理或者特定的数据结构,在一定条件下实现比线性时间更快的性能。

2.2 核心原理

常见的时间亚线性的字符串相等判定算法主要有基于哈希的算法和基于树的数据结构算法。这些算法的核心思路通常包括:

  • 哈希算法:利用字符串的哈希值进行比较。哈希值的计算复杂度通常是 O ( 1 ) O(1) O(1),因此利用哈希值进行比较可以显著减少整体比较时间。
  • Trie树:用Trie树来存储大规模字符串集合,通过树的结构加速查询和比较操作。
  • Rabin-Karp算法:这种算法使用滚动哈希技术,在滑动窗口的情况下计算哈希值,使得字符串比较的平均复杂度低于 O ( n ) O(n) O(n)

2.3 应用场景

串相等判定算法在多个领域有广泛应用,包括但不限于:

  • 网络安全:防止字典攻击和暴力破解,快速确认用户输入的口令是否在已知的口令集内。
  • 文本搜索:高效匹配大规模文本中的关键字,如搜索引擎中的匹配操作。
  • 基因序列匹配:在生物信息学中,快速比较和匹配DNA或RNA序列。
  • 数据去重:去除大规模数据集中的重复字符串。

2.4 算法公式

2.4.1 Rabin-Karp算法

以Rabin-Karp算法为例,公式如下:

计算模式字符串的哈希值: ( Hash ( P ) ) ( \text{Hash}(P) ) (Hash(P))
计算文本中每个滑动窗口的哈希值,并与模式字符串的哈希值进行比较:
[ Hash ( T [ i : i + m ] ) = ( d × ( Hash ( T [ i : i + m − 1 ] ) − T [ i ] × h ) + T [ i + m ] ) m o d    q ] [ \text{Hash}(T[i:i+m]) = (d \times (\text{Hash}(T[i:i+m-1]) - T[i] \times h) + T[i+m]) \mod q ] [Hash(T[i:i+m])=(d×(Hash(T[i:i+m1])T[i]×h)+T[i+m])modq]
其中:

  • ( d ) ( d ) (d) 是基数(如256)
  • ( q ) ( q ) (q) 是一个大的质数
  • ( h ) ( h ) (h) ( d ) ( d ) (d) ( m − 1 ) ( m-1 ) (m1) 次幂

2.4.2 哈希函数

以哈希函数 ,假设哈希函数 H H H,字符串 s s s的哈希值 H ( s ) H(s) H(s)可以表示为:
[ H ( s ) = ∑ i = 0 ∣ s ∣ − 1 s [ i ] × p i m o d    M ] [ H(s) = \sum_{i=0}^{|s|-1} s[i] \times p^i \mod M ] [H(s)=i=0s1s[i]×pimodM]
其中,

  • ( p ) ( p ) (p) 是一个质数,通常选择31或61,
  • ( M ) ( M ) (M) 是一个大的质数,通常选择 ( 1 0 9 + 7 ) ( 10^9+7 ) (109+7) 以减少哈希冲突。

2.5 代码示例

我们以 Rabin-Karp算法为例,使用Python实现:

# -*- coding:utf-8 -*-
# @Time   : 2024-08-12
# @Author : Carl_DJ

def rabin_karp(text, pattern):
    """Rabin-Karp算法实现字符串相等判定"""
    d = 256  # 基数
    q = 101  # 一个大质数
    n = len(text)
    m = len(pattern)
    h = 1
    p_hash = 0  # 模式字符串的哈希值
    t_hash = 0  # 当前文本窗口的哈希值

    # 计算 h = d^(m-1) % q
    for i in range(m-1):
        h = (h * d) % q
    
    # 计算模式字符串的哈希值和文本前m个字符的哈希值
    for i in range(m):
        p_hash = (d * p_hash + ord(pattern[i])) % q
        t_hash = (d * t_hash + ord(text[i])) % q

    # 滑动窗口检验
    for i in range(n - m + 1):
        if p_hash == t_hash:
            if text[i:i+m] == pattern:
                return True
        
        if i < n - m:
            t_hash = (d * (t_hash - ord(text[i]) * h) + ord(text[i + m])) % q

            # 处理t_hash可能为负值的情况
            if t_hash < 0:
                t_hash += q

    return False

# 示例数据
text = "abcdefg"
pattern = "cde"
result = rabin_karp(text, pattern)
print(f"模式字符串'{pattern}'是否出现在文本中: {result}")

在这里插入图片描述

3、总结

时间亚线性的串相等判定算法在大量涉及字符串比较和匹配的应用场景中表现出色。

通过引入哈希函数或树形数据结构,算法显著优化了时间复杂度,从而提高了处理效率。

然而,这些算法也有其适用的范围和前提条件,例如哈希冲突、预处理时间和额外的存储空间等。

因此,在实际应用中,需要根据具体的需求和数据特性来选择合适的算法,以达到最佳效果。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)评测一等奖获得者

关注小鱼,学习【大数据算法】领域最新最全的领域知识。


http://www.kler.cn/a/286812.html

相关文章:

  • Trimble三维激光扫描-地下公共设施维护的新途径【沪敖3D】
  • STM32-CAN总线
  • 简识JVM私有内存区域栈、数据结构
  • 26. 【.NET 8 实战--孢子记账--从单体到微服务】--需求更新--用户注销、修改用户名、安全设置
  • solidity基础 -- 存储类型
  • 概率论里的特征函数,如何用卷积定理去理解
  • Python 全栈系列266 Kafka服务的Docker搭建
  • ctfshow之web58~web71
  • Android --- transaction.commitAllowingStateLoss();和transcation.commit 有什么区别
  • J.U.C Review - volatile / synchronized / 锁 深入剖析
  • Java网络编程概述
  • 【maven】阿里云和apache仓库配置
  • Java 流过滤器是否足够智能,可以忽略有序流中不必要的项目吗?
  • 云计算实训40——部署project_exam_system项目及容器的编排
  • c++ 原型模式
  • 论文速读|通过人类远程操作的深度模仿学习框架:人型机器人的行走操纵技能
  • 【Pytorch】模型权重保存与上传
  • C#上位机采用数据库操作方式对Excel或WPS表格进行读取操作
  • 分布式系统中的Dapper与Twitter Zipkin:链路追踪技术的实现与应用
  • Ai产品经理的探索:技能、机遇与未来展望
  • 支付平台构建支付接口供整个公司调用—支付代理商
  • Git 学习
  • QT Sql 实现多个股票成交明细数据文件制成数据库并支持查询
  • Node原子计数器
  • 数据库性能测试2:内存数据库
  • 基于 Android Studio 实现的 记账本-MySQL版