字符串模式匹配算法系列(三):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语法 ...
随机推荐
- linux主机hang住echo 0 > /proc/sys/kernel/hung_task_timeout_secs disables this message
用dmesg显示如下图信息 问题原因: 默认情况下, Linux会最多使用40%的可用内存作为文件系统缓存.当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的IO请求都是同步的. ...
- 01、python的基础-->while循环应用
1.简单的输出小程序 name = input('请输入你的名字:') age = input('请输入你的年龄:') print('我的名字叫'+name,'我今年'+ age + '岁') 2.w ...
- tp5 之 "No input file specified
tp5 之 "No input file specified" 问题 通过"域名/模块/控制器/方法"这样的方式访问的时候,浏览器输出如下: 直接通过" ...
- Python for Eclipse插件Pydev安装后eclipse里面看不到
反复安装几次在eclipse里面都找不到,崩溃了,有的说是pydev版本不对,应该和python版本一致,都是扯淡,去pydev官网看了下requirement原来是需要Java1.7+以上,安装1. ...
- /etc/fstab自动挂载文件
装了Windows 10和Ubuntu双系统,想把win10下的“文娱“盘自动开机挂载到Ubuntu上. 首先你看一下/etc/fstab这个文件喽: 依葫芦画瓢呗.首先看看你要挂载的硬盘是哪一块: ...
- android 查看网络图片
public class MainActivity extends Activity { private EditText pathText; private ImageView imageView; ...
- Vue中app实例对象的几种写法
1.传统方法(练习 小DEMO中用的这种) <script type="text/ecmascript"> var app=new Vue({ el:"#ap ...
- VSCode中行数与代码之间用点点点代替
在settings.json中添加一行 "editor.renderWhitespace": "all"
- Mysql中存储过程和函数的写法
MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine ...
- List Comprehension ()(二)
在list comprehension中加入if条件判断: >>> lines = [line.rstrip() for line in open('script2.py') if ...