字符串模式匹配算法系列(三):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语法 ...
随机推荐
- 同时连接gitlab和github
---恢复内容开始--- 原文地址:https://juejin.im/post/5ac0cf356fb9a028df22c246 1. 分别生成gitlab和github的ssh key 生成第一个 ...
- Linux(Ubuntu)常用命令(五)—— vi/vim常用操作
vi/vim常用命令 vim其实就是vi的升级版,vi里的所有命令vim里都可以用,一般使用来说几乎没什么差别. 注:本篇文章区分大小写! vi / vim三级模式的关系: 命令行模式 任何时候,不管 ...
- 关于tomcat中的三个端口的作用及其相关细节
[一]端口内容 tomcat的端口号相关信息: Tomcat admin port——管理端口,允许你远程配置tomcat HTTP——正常的http协议 AJP——Apache JServ Prot ...
- docker-compos联合两个容器
使用网络 ' services: web: image: http networks: - myappnet1 worker: image: http networks: - myappnet2 db ...
- 模拟javaWeb责任链的设计
这篇文章介绍了责任链模式的应用:本文介绍如果自己实现一个责任链 定义请求和响应信息 简单定义请求类Request(封装一个字符串) public class Request { String requ ...
- Model-View-ViewModel (MVVM) Explained 转摘自:http://www.wintellect.com/blogs/jlikness/model-view-viewmodel-mvvm-explained
The purpose of this post is to provide an introduction to the Model-View-ViewModel (MVVM) pattern. W ...
- centos7 部署镜像仓库 harbor步骤详解
一.基础设置 1.1 安装vim.wget yum install -y vim wget 1.2 卸载home.扩大root 如果考虑镜像仓库是给研发团队使用,需要配置较大容量的,因为cento ...
- linux随笔-02
部署虚拟环境安装linux系统以及一些常用命令 工具: VmwareWorkStation 12.0——虚拟机软件(必需) RedHatEnterpriseLinux [RHEL]7.0——红帽操作 ...
- Codeforces 364D 随机算法
题意:给你一个序列,定义ghd为一个序列中任意n / 2个数的gcd中最大的那个,现在问这个序列的ghd为多少. 思路:居然是论文题...来自2014年国家集训队论文<随机化算法在信息学竞赛中的 ...
- SpringMvc返回给前端数据@ResponseBody响应体【支持Ajax】
1).在Controller中写 //@ResponseBody响应体是jackson包提供的 用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格 ...