python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串

一.trie树应用:

相应leetcode

常用于搜索提示,如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。

例如三个单词app, apple, add,我们按照以下规则创建了一颗Trie树.对于从树的根结点走到黑色结点的路径上的字母依次组合起来就是一个完整的单词. 


class Trie:def __init__(self):"""Initialize your data structure here."""self.root = {}self.word_end = -1def insert(self, word):"""Inserts a word into the trie."""curNode = self.rootfor c in word:# print('==self.root:', self.root)if c not in curNode:curNode[c] = {}curNode = curNode[c]curNode[self.word_end] = Truedef search(self, word):"""Returns if the word is in the trie."""curNode = self.rootfor c in word:if c not in curNode:return FalsecurNode = curNode[c]# Doesn't end hereif self.word_end not in curNode:return Falsereturn Truedef startsWith(self, prefix):"""Returns if there is any word in the trie that starts with the given prefix."""curNode = self.rootfor c in prefix:if c not in curNode:return FalsecurNode = curNode[c]return Trueword = 'apple'
prefix = 'ad'
obj = Trie()
obj.insert(word='apple')
obj.insert(word='add')
obj.insert(word='app')
print('tree:', obj.root)
param_2 = obj.search(word)
print('search res:',param_2)
param_3 = obj.startsWith(prefix)
print('prefix find:',param_3)

二.字符串匹配算法

1.朴素匹配算法

暴力解法,时间复杂度是O(m*n) 。

t = 'aabaabaabab'
p = 'abc'
print(nmatching(t,p))
def match_string(t,p):n=len(t)m=len(p)i=j=0while i<n and j<m:if t[i]==p[j]:i+=1j+=1else:i=i-j+1j=0if j==m:return str(i-j)else:return 'no mismatch'
res=match_string(t,p)
print('res:',res)

2.RK算法

采用字符串的hash值进行匹配,时复杂度O(n),最差情况退化到朴素匹配,时间复杂度也为O(m*n)

def compute_hash(str_):"""a的hash值是0,其它依次加1"""hash_code = 0for i in range(len(str_)):# print('str_[i]', str_[i])hash_code += ord(str_[i])-ord('a')return hash_code#RK算法
def RK(main_str,pattern_str):"""通过比较字符串的hash值 从而找到子串 时间复杂度O(n),遇见复杂情况就退化为了O(mn))"""pattern_hash_code = compute_hash(pattern_str)pattern_len = len(pattern_str)print('==模式串hash_code', pattern_hash_code)str_hash_code = compute_hash(main_str[:pattern_len])print('==子串_hash_code', str_hash_code)for i in range(len(main_str)-len(pattern_str)+1):if str_hash_code == pattern_hash_code and main_str[i:i+len(pattern_str)] == pattern_str:return ielse:str_hash_code -= ord(main_str[i]) - ord('a')str_hash_code += ord(main_str[i + len(pattern_str)]) - ord('a')
# hash_code = compute_hash('ab')
# print('hash_code:', hash_code)
# main_str = 'ad'
# pattern_str = 'ad'
main_str = 'aacdesadsdfer'
pattern_str = 'adsd'
index =  RK(main_str, pattern_str)
print('子串的位置在:', index)

3.KMP算法

记录最长公共前后缀,然后字符串匹配按照这个来,时间复杂度O(n)

最长公共前后缀计算:

示意:

代码:

#最长公共前后缀
def pefix_table(pattern):"""字符串最长公共前后缀思路:通过遍历字符串来寻找公共部分,当出现不一样的时候 需要回退直到比较首字符"""""" 'ababcabaa' """# """ 'ababa' """# 'aa'i = 0prefix = [0]*len(pattern)for j in range(1, len(pattern)):while(pattern[j]!=pattern[i] and i>0):#循环判断如果发现没有相等就一直回退直到i==0也就是首字符i = prefix[i-1]if pattern[j] == pattern[i]:#相等的話就记录相等的长度i += 1prefix[j] = ielse:prefix[j] = 0#不相等的話就长度长公共前后缀记录为0return prefixdef move_prefix(prefix):""""""real_prefix = [-1]*len(prefix)for i in range(len(prefix)-1):real_prefix[i+1]=prefix[i]return real_prefixstr_ = 'ababcabaa'
# str_ = 'ababa'
prefix = pefix_table(str_)
print('==prefix:', prefix)

 

kmp匹配开始:

按照b的下标移动,会发现前面相似的不需要比对:

#最长公共前后缀
def pefix_table(pattern):"""字符串最长公共前后缀思路:通过遍历字符串来寻找公共部分,当出现不一样的时候 需要回退直到比较首字符"""""" 'ababcabaa' """# """ 'ababa' """# 'aa'i = 0prefix = [0]*len(pattern)for j in range(1, len(pattern)):while(pattern[j]!=pattern[i] and i>0):#循环判断如果发现没有相等就一直回退直到i==0也就是首字符i = prefix[i-1]if pattern[j] == pattern[i]:#相等的話就记录相等的长度i += 1prefix[j] = ielse:prefix[j] = 0#不相等的話就长度长公共前后缀记录为0return prefixdef move_prefix(prefix):""""""real_prefix = [-1]*len(prefix)for i in range(len(prefix)-1):real_prefix[i+1]=prefix[i]return real_prefix# str_ = 'ababcabaa'
# # str_ = 'ababa'
# prefix = pefix_table(str_)
# print('==prefix:', prefix)
# prefix = move_prefix(prefix)
# print('==prefix:', prefix)def kmp(main_str,pattern_str):"""kmp比对"""i = 0j = 0n = len(pattern_str)while i < len(main_str):if j == n-1 and main_str[i] == pattern_str[j]:print('find pattern at {}'.format(i-j))j = prefix[j]if main_str[i] == pattern_str[j]:i += 1j += 1else:j = prefix[j]if j == -1:#找到边界都向右移动一位i += 1j += 1pattern_str ='ababcabaa'
main_str = 'abababcabaabababab'prefix = pefix_table(pattern_str)
# print('==prefix:', prefix)
prefix = move_prefix(prefix)
print('==prefix:', prefix)
kmp(main_str, pattern_str)

参考:

https://blog.csdn.net/weixin_42698229/article/details/90321230

https://blog.csdn.net/weixin_39561100/article/details/80822208

https://www.bilibili.com/video/BV1hW411a7ys/?spm_id_from=trigger_reload

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天才也勤奋!DeepMind哈萨比斯自述:领导400名博士向前,每天工作至凌晨4点

来源&#xff1a;量子位你见过凌晨4点的伦敦吗&#xff1f;哈萨比斯天天见。这位DeepMind创始人、AlphaGo之父&#xff0c;一直是全球赞颂的当世天才&#xff0c;但每天要到凌晨4点&#xff0c;才能睡下。这是哈萨比斯最新采访中透露的作息时间&#xff0c;他告诉《星期日泰晤士…

RNN知识+LSTM知识+encoder-decoder+ctc+基于pytorch的crnn网络结构

一&#xff0e;基础知识&#xff1a; 下图是一个循环神经网络实现语言模型的示例&#xff0c;可以看出其是基于当前的输入与过去的输入序列&#xff0c;预测序列的下一个字符&#xff0e; 序列特点就是某一步的输出不仅依赖于这一步的输入&#xff0c;还依赖于其他步的输入或输…

利用flask写的接口(base64, 二进制, 上传视频流)+异步+gunicorn部署Flask服务+多gpu卡部署

一.flask写的接口 1.1 manage.py启动服务(发送图片base64版) 这里要注意的是用docker的话,记得端口映射 #coding:utf-8 import base64 import io import logging import picklefrom flask import Flask, jsonify, request from PIL import Image from sklearn import metric…

2018中国自动驾驶市场专题分析

来源&#xff1a;智车科技未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#…

python写日志

需要再加入按照日期生成日志 #coding:utf-8 import logging import logging.handlers class Logger:logFile def __init__(self, logFile):self.logFile logFileself.logger logging.getLogger(mylogger)self.logger.setLevel(logging.INFO)rf_handler logging.handlers.…

MIT科学家Dimitri P. Bertsekas最新2019出版《强化学习与最优控制》(附书稿PDF讲义)...

来源&#xff1a;专知摘要&#xff1a;MIT科学家Dimitri P. Bertsekas今日发布了一份2019即将出版的《强化学习与最优控制》书稿及讲义&#xff0c;该专著目的在于探索这人工智能与最优控制的共同边界&#xff0c;形成一个可以在任一领域具有背景的人员都可以访问的桥梁。REINF…

yolov3 anchors用kmeans聚类出先验框+anchor宽高比分析

一&#xff0e;yolov v3聚类出框 # -*- coding: utf-8 -*- import numpy as np import random import argparse import os# # 参数名称 # parser argparse.ArgumentParser(description使用该脚本生成YOLO-V3的anchor boxes\n) # parser.add_argument(--input_annotation_txt…

Geoff Hinton:全新的想法将比微小的改进更有影响力

来源&#xff1a;AI科技评论摘要&#xff1a;日前&#xff0c;WIRED 对 Hinton 进行了一次专访&#xff0c;在访谈中&#xff0c;WIRED 针对人工智能带来的道德挑战和面临的挑战等问题进行了提问&#xff0c;以下为谈话内容。“作为一名谷歌高管&#xff0c;我认为在公开场合抱…

修改TOMCAT服务器图标为应用LOGO

在tomcat下部署应用程序&#xff0c;运行后&#xff0c;发现在地址栏中会显示tomcat的小猫咪图标。有时候&#xff0c;我们自己不想显示这个图标&#xff0c;想换成自己定义的的图标&#xff0c;那么按如下方法操作即可&#xff1a; 参考网上的解决方案&#xff1a;1、将$TOMCA…

python连接mysql的一些基础知识+安装Navicat可视化数据库+flask_sqlalchemy写数据库

一&#xff0e;mysql基础知识 &#xff11;&#xff0e;connect连接数据库 import pymysqldef get_conn():conn pymysql.connect(hostxxx.xxx.xxx.xxx, port3306, userroot, passwd, dbnewspaper_rest) # db:表示数据库名称return conn &#xff12;&#xff0e;创建表 im…

工业互联网平台创新发展白皮书(2018)

来源&#xff1a;走向智能论坛摘要&#xff1a;近日&#xff0c;在“2018年产业互联网与数据经济大会——首届工业互联网平台创新发展暨两化融合推进会”上&#xff0c;国家工业信息安全发展研究中心尹丽波主任发布并解读了《工业互联网平台创新发展白皮书&#xff08;2018&…

迭代器模式和组合模式混用

迭代器模式和组合模式混用 前言 园子里说设计模式的文章算得上是海量了&#xff0c;所以本篇文章所用到的迭代器设计模式和组合模式不提供原理解析&#xff0c;有兴趣的朋友可以到一些前辈的设计模式文章上学学&#xff0c;很多很有意思的。在Head First 设计模式这本书中&…

python实现可扩容队列

#coding:utf-8 """ fzh created on 2019/10/15 构建一个队列 """ import datetimeclass LoopQueue(object):def __init__(self, n10):self.arr [None] * (n1) # 由于特意浪费了一个空间&#xff0c;所以arr的实际大小应该是用户传入的容量1sel…

5G 产业链重要投资节点

来源&#xff1a;兴业证券 ▌5G:大通信容量及超低延时&#xff0c;未来多项应用的基础5G:高工作频率以及频谱带宽带来高通信容量5G(5thgeneration)是指第五代移动电话通信标准。3GPP(第三代合作伙伴计划&#xff0c;电信标准化机构)将5G标准分为了NSA(非独立组网)和SA(独立组网…

Kneser猜想与相关推广

本文本来是想放在Borsuk-Ulam定理的应用这篇文章当中。但是这个文章实在是太长&#xff0c;导致有喧宾夺主之嫌&#xff0c;从而独立出为一篇文章&#xff0c;仅供参考。$\newcommand{\di}{\mathrm{dist}}$ &#xff08;图1&#xff1a;Kneser叙述他的猜想原文手稿&#xff09;…

python .py文件变为.so文件进行加密

&#xff11;.mytest.py 需要加密的内容 #coding:utf-8 import datetimeclass Today():def get_time(self):print(datetime.datetime.now())def say(self):print("hello word!")today Today() today.say() today.get_time() 2.执行setup.py 也就是加密脚本 from…

从技术上解读大数据的应用现状和开源未来

来源&#xff1a;网络大数据作者 | 韩锐、 Lizy Kurian John、詹剑锋摘要&#xff1a;近年来&#xff0c;随着大数据系统的快速发展&#xff0c;各式各样的开源基准测试集被开发出来&#xff0c;以评测和分析大数据系统并促进其技术改进。然而&#xff0c;迄今为止&#xff0c;…

十八岁华裔天才携手「量子计算先驱」再次颠覆量子计算

来源&#xff1a;机器之心编译参与&#xff1a;刘晓坤、李泽南摘要&#xff1a;量子计算再一次「被打败了」。今年 8 月&#xff0c;刚刚年满 18 岁的 Ewin Tang 证明了经典算法能以和量子计算机相近的速度解决推荐问题&#xff0c;这位天才少女&#xff08;更正&#xff1a;不…

resnet系列+mobilenet v2+pytorch代码实现

一.resnet系列backbone import torch.nn as nn import math import torch.utils.model_zoo as model_zooBatchNorm2d nn.BatchNorm2d__all__ [ResNet, resnet18, resnet34, resnet50, resnet101, deformable_resnet18, deformable_resnet50,resnet152]model_urls {resnet18:…

广度优先搜索(BFS)与深度优先搜索(DFS)

一.广度优先搜索&#xff08;BFS&#xff09; 1.二叉树代码 # 实现一个二叉树 class TreeNode:def __init__(self, x):self.val xself.left Noneself.right Noneself.nexts []root_node TreeNode(1) node_2 TreeNode(2) node_3 TreeNode(3) node_4 TreeNode(4) node_…