【KMP算法-数字范围匹配】VB.NET代码

Public Class KMP算法
    Function 开始(主串 As Int16(), 子串 As Int16(), [Next] As Int32(), 容错值 As Int16) As Int32
        Dim 主长度 As Int32 = 主串.Length - 1
        Dim 子长度 As Int32 = 子串.Length - 1
        Dim i As Int32 = 0
        Dim j As Int32 = 0
        Dim 运行次数 As Int32
        Dim 最相似长度 As Int32
        Dim 最相似位置 As Int32
        If [Next] Is Nothing Then
            Return -1
        End If
        Do Until j > 子长度 OrElse i > 主长度
            If j = -1 OrElse (主串(i) - 容错值 < 子串(j) AndAlso 主串(i) + 容错值 > 子串(j)) Then
                If j > 最相似长度 Then
                    最相似长度 = j
                    最相似位置 = i
                End If
                i += 1
                j += 1
            Else
                j = [Next](j)
            End If
            运行次数 += 1
        Loop
        Debug.WriteLine($"匹配次数: {运行次数}")
        If 最相似长度 > 子长度 * 0.5 Then
            Return 最相似位置 - 最相似长度
        Else
            Return -1
        End If
    End Function
    Function GetNext(子串 As Int16(), 子长度 As Int32) As Int32()
        Dim i As Int32 = 1
        Dim k As Int32 = 0
        Dim [Next](子长度) As Int32
        [Next](0) = -1
        [Next](1) = 0
        Do While i < 子长度
            If k = -1 OrElse 子串(i) = 子串(k) Then
                k += 1
                i += 1
                [Next](i) = k
            Else
                k = [Next](k)
            End If
        Loop
        Return [Next]
    End Function
    Function GetNextVal(子串 As Int16(), 子长度 As Int32) As Int32()
        Dim i As Int32 = 1
        Dim k As Int32 = 0
        Dim NextVal(子长度) As Int32
        NextVal(0) = -1
        NextVal(1) = 0
        Do While i < 子长度
            If k = -1 OrElse 子串(i) = 子串(k) Then
                k += 1
                i += 1
                If 子串(i) = 子串(k) Then
                    NextVal(i) = NextVal(k)
                Else
                    NextVal(i) = k
                End If
            Else
                k = NextVal(k)
            End If
        Loop
        Return NextVal
    End Function
End Class
Private Function 暴力匹配(主串 As Int16(), 子串 As Int16(), 容错值 As Int16) As Int32
        Dim 主长度 As Int32 = 主串.Length - 1
        Dim 子长度 As Int32 = 子串.Length - 1
        Dim i As Int32 = 0
        Dim j As Int32 = 0
        Dim 记忆i As Int32 = 0
        Dim 运行次数 As Int32
        Dim 最相似长度 As Int32
        Dim 最相似位置 As Int32
        Do Until j > 子长度 OrElse i > 主长度
            If 主串(i) - 容错值 < 子串(j) AndAlso 主串(i) + 容错值 > 子串(j) Then
                If j > 最相似长度 Then
                    最相似长度 = j
                    最相似位置 = i
                End If
                i += 1
                j += 1
            Else
                记忆i += 1
                i = 记忆i
                j = 0
            End If
            运行次数 += 1
        Loop
        Debug.WriteLine($"匹配次数: {运行次数}")
        If 最相似长度 > 子长度 * 0.1 Then
            Return 最相似位置 - 最相似长度
        Else
            Return -1
        End If
    End Function

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值