字符串模式匹配算法系列(三):Trie树及AC改进算法
Trie树的python实现(leetcode 208)
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import pdb reload(sys)
sys.setdefaultencoding('utf-8') class TrieNode(object):
"""Trie节点 Attributes:
_val: 本节点的值(非None即作为结束判断条件)
_next: 后继节点
"""
def __init__(self, value=None):
self._val = value
self._next = {} def set_value(self, value=None):
"""为当前节点设置值
"""
self._val = value def get_value(self):
"""获取当前节点的值
"""
return self._val def set_next(self, key, value=None):
"""为当前节点添加一个后继节点
"""
if key not in self._next:
self._next[key] = TrieNode(value)
return self._next[key] def get_next(self, key):
"""从当前节点获取指定的后继节点
"""
if key not in self._next:
return None
return self._next[key] class Trie(object):
"""Trie树
Attribures:
_root: 根节点
"""
def __init__(self):
# 生成root节点
self._root = TrieNode() def insert(self, word):
"""将一个单词插入trie树
"""
curr = self._root for char in word:
curr = curr.set_next(char)
curr.set_value(True) def search(self, word):
"""检索一个单词是否trie树中存在
"""
curr = self._root
ret = False for i, c in enumerate(word):
curr = curr.get_next(c)
if curr is None:
break
if i + 1 == len(word) and curr.get_value() is True:
ret = True
break
return ret def startsWith(self, prefix):
"""检索trie树中是否有prefix开头的单词
"""
curr = self._root
ret = True for c in prefix:
curr = curr.get_next(c)
if curr is None:
ret = False
break
return ret def main():
trie = Trie()
trie.insert("app")
trie.insert("apple")
print trie.search("app") if __name__ == '__main__':
main()
AC改进算法python实现
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import pdb reload(sys)
sys.setdefaultencoding('utf-8') class ACTrieNode(object):
"""ACTrie节点 Attributes:
val: 本节点的值(非None即作为结束判断条件)
children: 孩子节点
fail: 失配跳转指针
"""
def __init__(self, value=None):
self.val = value
self.children = {}
self.fail = None def get_next(self, key):
"""从本节点开始,找到children中包含key的节点,如果找不到就返回根节点
"""
if key in self.children.keys():
return self.children[key]
if self.fail is None:
# fail为None就是根节点
return self
return self.fail.get_next(key) class ACTrie(object):
"""ACTrie树 Attribures:
_root: 根节点
"""
def __init__(self):
self._root = ACTrieNode() # 生成root节点 def insert(self, word):
"""将一个单词插入trie树
"""
curr = self._root
for char in word:
if char not in curr.children:
curr.children[char] = ACTrieNode()
curr = curr.children[char]
curr.val = word def update_failure(self):
"""更新failure跳转
"""
bfs_queue = [self._root] # 利用list作为bfs缓存队列 while len(bfs_queue) > 0:
father = bfs_queue.pop(0) # 取出队列头部元素 # BFS遍历父节点的所有子节点,为他们设置failure
for key, child in father.children.items():
bfs_queue.append(child) # 将当前元素放入队列尾部 if father == self._root:
# 当前父节点是root时,其子节点的failure也指向root
child.fail = self._root
else:
# 当前父节点不是root时,其子节点的failure尝试指向"(迭代)父节点的failure的同名子节点"
child.fail = father.fail.get_next(key) def search(self, text):
"""从源字符串中寻找目标字符串
"""
match_set = set()
curr = self._root for char in text:
curr = curr.get_next(char)
# 搜集匹配上的单词
tmp_node = curr
while tmp_node:
if tmp_node.val:
match_set.add(tmp_node.val)
tmp_node = tmp_node.fail
return match_set def main():
trie = ACTrie()
trie.insert("abcd")
trie.insert("ab")
trie.insert("bc")
trie.insert("cf")
trie.insert("cde") trie.update_failure() text = 'abcdefg'
ret = trie.search(text)
print ret if __name__ == '__main__':
main()
字符串模式匹配算法系列(三):Trie树及AC改进算法的更多相关文章
- 字符串模式匹配算法系列(二):KMP算法
算法背景: KMP算法是由Donald Knuth和Vaughan Pratt于1970年共同提出的,而James H.Morris也几乎同时间独立提出了这个算法.因此人们将其称作“克努特-莫里斯-普 ...
- 字符串模式匹配算法系列(一):BF算法
算法背景: BF(Brute Force)算法,是一种在字符串匹配的算法中,比较符合人类自然思维方式的方法,即对源字符串和目标字符串逐个字符地进行比较,直到在源字符串中找到完全与目标字符串匹配的子字符 ...
- [转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boy ...
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 ...
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...
- 字符串模式匹配算法--BF和KMP详解
1,问题描述 字符串模式匹配:串的模式匹配 ,是求第一个字符串(模式串:str2)在第二个字符串(主串:str1)中的起始位置. 注意区分: 子串:要求连续 (如:abc 是abcdef的子串) ...
- Java数据结构之字符串模式匹配算法---Brute-Force算法
模式匹配 在字符串匹配问题中,我们期待察看源串 " S串 " 中是否含有目标串 " 串T " (也叫模式串).其中 串S被称为主串,串T被称为子串. 1.如果在 ...
- [知识点]Trie树和AC自动机
// 此博文为迁移而来,写于2015年5月27日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1s8.html 1.前 ...
- 字符串模式匹配算法1 - BF和KMP算法
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...
随机推荐
- node_exporter + grafana
监控服务器CPU.内存.磁盘.I/O等信息,首先需要安装node_exporter.node_exporter的作用是用于机器系统数据收集. 下载安装: https://github.com/prom ...
- 爬取拉勾网所有python职位并保存到excel表格 对象方式
# 1.把之间案例,使用bs4,正则,xpath,进行数据提取. # 2.爬取拉钩网上的所有python职位. from urllib import request,parse import json ...
- undefined,null,var 0 = {},var s = '',的区别
undefined:不清楚变量的类型:var m; null:知道该变量是对象的引用,但是地址为空 var o = {};这是一个对象,有指向地址,但是值为空 var 0 = '';这是一个空的字符串
- 动画FPS计算
1.chrome的debug 2.PerformanceObserver var observer = new PerformanceObserver(function (list) { var pe ...
- 牛客网挑战赛24 青蛙(BFS)
链接:https://www.nowcoder.com/acm/contest/157/E来源:牛客网 有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟.于是便开始踏上了旅途 一直这 ...
- SpringBoot集成Swagger,Postman,newman,jenkins自动化测试.
环境:Spring Boot,Swagger,gradle,Postman,newman,jenkins SpringBoot环境搭建. Swagger简介 Swagger 是一款RESTFUL接口的 ...
- git help
- spring3.0+jsf+ibatis整合
user.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLI ...
- vue证明题四,使用组件
vue的开发方式,基本上是以组件为主的,至于为啥,我也不好去论述,网上看别人的 所谓渐进式开发,也是源自于单页面应用这一说,而注册一个域名以后,指定了首页,爬虫爬取链接都是从首页开始的 如果一个网址, ...
- 钉钉机器人SDK 封装预警消息发送工具
1 群机器人 (1) 引言 钉钉聊天群内支持的群机器人, 类似QQ 群机器人, 可以发天气, 讲笑话那样; 钉钉群机器人支持自定义机器人, 允许开发者管理机器人做预警消息通知; ...