Trie树子节点快速获取法
今天做了一道leetcode上关于字典树的题:https://leetcode.com/problems/word-search-ii/#/description
一开始坚持不看别人的思路,完全自己写,结果第一次跑通之后,性能直接排倒数,后来优化到自认为觉得最优了,还是在中下游,大概70ms左右,而主流的时间在20ms左右。百思不得其解,只能看别人的代码了,看了之后发现构造trie树的时候,有一个自己以前完全不知道的技巧:
Trie树结构除了根节点外,每一个节点都代表一个字符(题目里是a-z),每个节点还有若干子节点代表可能的下一个字符,问题就在于如何存储子节点的集合才能最快根据对应字符get到。一开始我是用的一个List,这样get的时候需要遍历整个List,一个一个和目标字符去比较。这种当然很明显是慢,后来我自己优化的时候改成了Map,用字符作为key,这样我觉得已经到达了O(1)的极限了啊,然而我还是too young。
最佳的做法应该是用一个长度26的数组arr来保存,怎么存呢?很简单,假如一个字符是c,那么就可以把它存到arr[c-'a'],因为a-z字母的ascii码是连续的,所以c-'a'正好会落到0-25之间。
当然这个方法有其局限性,只能用于a-z,但是理论上用类似的方法应该可以处理更多的情况,比如要处理utf8的中文的话,utf8所有汉字应该也都是连续的落到一个区间上,当然这个区间会很大(汉字大概有8w左右),空间可能会有很大的浪费。不过我有种直觉,记住这个技巧会有一天用的上的。
Trie树子节点快速获取法的更多相关文章
- zTree实现删除树子节点
zTree实现删除树子节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</tit ...
- C++求树子节点权重最大的和
#include <iostream> #include <vector> using namespace std; int n; const int MaxN = 1e5; ...
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...
- trie树信息抽取之中文数字抽取
这一章讲一下利用trie树对中文数字抽取的算法.trie树是一个非常有用的数据结构,可以应用于大部分文本信息抽取/转换之中,后续会开一个系列,对我在实践中摸索出来的各种抽取算法讲开来.比如中文时间抽取 ...
- HDU1247 Hat’s Words 【trie树】
Hat's Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- NKOJ4191 Trie树
问题描述 字母(Trie)树是一个表示一个字符串集合中所有字符串的前缀的数据结构,其有如下特征: 1.树的每一条边表示字母表中的一个字母 2.树根表示一个空的前缀 3.树上所有其他的节点都表示一个 ...
- [POJ 1204]Word Puzzles(Trie树暴搜&AC自己主动机)
Description Word puzzles are usually simple and very entertaining for all ages. They are so entertai ...
- BZOJ 3439 Kpm的MC密码 (Trie树+线段树合并)
题面 先把每个串反着插进$Trie$树 每个节点的子树内,可能有一些节点是某些字符串的开头 每个节点挂一棵权值线段树,记录这些节点对应的原来字符串的编号 查询的时候在线段树上二分即可 为了节省空间,使 ...
- The XOR Largest Pair (trie树)
题目描述 在给定的 NN 个整数 A_1,A_2,--,A_NA1,A2,--,AN 中选出两个进行xor运算,得到的结果最大是多少?xor表示二进制的异或(^)运算符号. 输入格式 第一行输入 ...
随机推荐
- 谷歌发布 Android 8.1 首个开发者预览版,优化内存效率
今晨,谷歌推出了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化,其中包含对 Android Go (设备运行内存小于等于 1 GB)和加速设备上对机器学习的全新神经网 ...
- 解题:HEOI 2015 最短不公共子串
题面 制杖四合一,HEOI以前居然出这种**题,看来HE还是联考比较好= = 首先对第二个串建SAM 第一个简单,以每个位置为起点在SAM上走,失配时更新答案 第二个先在第二个串上预处理$firs[i ...
- bzoj 4451 : [Cerc2015]Frightful Formula FFT
4451: [Cerc2015]Frightful Formula Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 177 Solved: 57[Sub ...
- [POI2008] BLO
link 试题分析 分两种情况考虑. 当此点不是割点是,答案是$2\times (n-1)$. 当是割点时,我们发现这个点把树分成了若干个联通块,只要两两相乘即可. #include<iostr ...
- SpringMVC 使用@ResponseBody返回json 中文乱码
这确实是个蛋疼的问题,Spring中解析字符串的转换器默认编码居然是ISO-8859-1 既然找到问题了,那就必须想办法改过来,不同版本的Spring好像方法还不一样,网上不少说的都是Spring3. ...
- golang 安装一个项目下的所有依赖
go get -v ./...
- navicat链接mysql
navicat链接mysql
- [Java] 理解JVM之一:工作机制及基本结构
一.基本结构 类加载器:在 JVM 启动时或在类运行时需要将类的字节码信息加载到 JVM 内存区域中. 执行引擎:负责执行字节码信息中包含的字节码指令,相当于实际机器上的 CPU. 内存区域:也被称为 ...
- python---基础知识回顾(九)图形用户界面-------WxPython
主要使用wxPython(最成熟的跨平台python GUI工具包) wxPython手册 前戏:基础了解 import wx class MyFrame(wx.Frame): #创建自定义Frame ...
- 超简单将Centos的yum源更换为国内的阿里云源
自己的yum源不知道什么时候给改毁了……搜到了个超简单的方法将yum源更换为阿里的源 完全参考 http://mirrors.aliyun.com/help/centos?spm=5176.bbsr1 ...