当前位置: 首页 > news >正文 腾讯建站官网新手做哪类网站 news 2025/11/3 0:05:30 腾讯建站官网,新手做哪类网站,wordpress主题新闻,禁用Wordpress响应模式文章目录 什么是“Trie 树”#xff1f;如何实现一棵 Trie 树#xff1f;Trie 树真的很耗内存吗#xff1f;Trie 树与散列表、红黑树的比较 什么是“Trie 树”#xff1f; Trie 树#xff0c;也叫“字典树”。顾名思义#xff0c;它是一个树形结构。它是一种专门处理字符… 文章目录 什么是“Trie 树”如何实现一棵 Trie 树Trie 树真的很耗内存吗Trie 树与散列表、红黑树的比较 什么是“Trie 树” Trie 树也叫“字典树”。顾名思义它是一个树形结构。它是一种专门处理字符串匹配的数据结构用来解决在一组字符串集合中快速查找某个字符串的问题。 当然这样一个问题可以有多种解决方法比如散列表、红黑树或者我们前面几节讲到的一些字符串匹配算法但是Trie 树在这个问题的解决上有它特有的优点。不仅如此Trie 树能解决的问题也不限于此我们一会儿慢慢分析。 现在我们先来看下Trie 树到底长什么样子。 我举个简单的例子来说明一下。我们有 6 个字符串它们分别是howhiherhellososee。我们希望在里面多次查找某个字符串是否存在。如果每次查找都是拿要查找的字符串跟这 6 个字符串依次进行字符串匹配那效率就比较低有没有更高效的方法呢 这个时候我们就可以先对这 6 个字符串做一下预处理组织成 Trie 树的结构之后每次查找都是在 Trie 树中进行匹配查找。Trie 树的本质就是利用字符串之间的公共前缀将重复的前缀合并在一起。最后构造出来的就是下面这个图中的样子。 其中根节点不包含任何信息。每个节点表示一个字符串中的字符从根节点到红色节点的一条路径表示一个字符串注意红色节点并不都是叶子节点。 为了让你更容易理解 Trie 树是怎么构造出来的我画了一个 Trie 树构造的分解过程。构造过程的每一步都相当于往 Trie 树中插入一个字符串。当所有字符串都插入完成之后Trie 树就构造好了。 当我们在 Trie 树中查找一个字符串的时候比如查找字符串“her”那我们将要查找的字符串分割成单个的字符 her然后从 Trie 树的根节点开始匹配。如图所示绿色的路径就是在 Trie 树中匹配的路径。 如果我们要查找的是字符串“he”呢我们还用上面同样的方法从根节点开始沿着某条路径来匹配如图所示绿色的路径是字符串“he”匹配的路径。但是路径的最后一个节点“e”并不是红色的。也就是说“he”是某个字符串的前缀子串但并不能完全匹配任何字符串。 如何实现一棵 Trie 树 知道了 Trie 树长什么样子我们现在来看下如何用代码来实现一个 Trie 树。 从刚刚 Trie 树的介绍来看Trie 树主要有两个操作一个是将字符串集合构造成 Trie 树。这个过程分解开来的话就是一个将字符串插入到 Trie 树的过程。另一个是在 Trie 树中查询一个字符串。 了解了 Trie 树的两个主要操作之后我们再来看下如何存储一个 Trie 树 从前面的图中我们可以看出Trie 树是一个多叉树。我们知道二叉树中一个节点的左右子节点是通过两个指针来存储的如下所示 Java 代码。那对于多叉树来说我们怎么存储一个节点的所有子节点的指针呢 class BinaryTreeNode {char data;BinaryTreeNode left;BinaryTreeNode right; } 我先介绍其中一种存储方式也是经典的存储方式大部分数据结构和算法书籍中都是这么讲的。还记得我们前面讲到的散列表吗借助散列表的思想我们通过一个下标与字符一一映射的数组来存储子节点的指针。这句话稍微有点抽象不怎么好懂我画了一张图你可以看看。 假设我们的字符串中只有从 a 到 z 这 26 个小写字母我们在数组中下标为 0 的位置存储指向子节点 a 的指针下标为 1 的位置存储指向子节点 b 的指针以此类推下标为 25 的位置存储的是指向的子节点 z 的指针。如果某个字符的子节点不存在我们就在对应的下标的位置存储 null。 class TrieNode {char data;TrieNode children[26]; }当我们在 Trie 树中查找字符串的时候我们就可以通过字符的 ASCII 码减去“a”的 ASCII 码迅速找到匹配的子节点的指针。比如d 的 ASCII 码减去 a 的 ASCII 码就是 3那子节点 d 的指针就存储在数组中下标为 3 的位置中。 描述了这么多有可能你还是有点懵我把上面的描述翻译成了代码你可以结合着一块看下应该有助于你理解。 public class Trie {private TrieNode root new TrieNode(/); // 存储无意义字符// 往Trie树中插入一个字符串public void insert(char[] text) {TrieNode p root;for (int i 0; i text.length; i) {int index text[i] - a;if (p.children[index] null) {TrieNode newNode new TrieNode(text[i]);p.children[index] newNode;}p p.children[index];}p.isEndingChar true;}// 在Trie树中查找一个字符串public boolean find(char[] pattern) {TrieNode p root;for (int i 0; i pattern.length; i) {int index pattern[i] - a;if (p.children[index] null) {return false; // 不存在pattern}p p.children[index];}if (p.isEndingChar false) return false; // 不能完全匹配只是前缀else return true; // 找到pattern}public class TrieNode {public char data;public TrieNode[] children new TrieNode[26];public boolean isEndingChar false;public TrieNode(char data) {this.data data;}} }Trie 树的实现你现在应该搞懂了。现在我们来看下在 Trie 树中查找某个字符串的时间复杂度是多少 如果要在一组字符串中频繁地查询某些字符串用 Trie 树会非常高效。构建 Trie 树的过程需要扫描所有的字符串时间复杂度是 O(n)n 表示所有字符串的长度和。但是一旦构建成功之后后续的查询操作会非常高效。 每次查询时如果要查询的字符串长度是 k那我们只需要比对大约 k 个节点就能完成查询操作。跟原本那组字符串的长度和个数没有任何关系。所以说构建好 Trie 树后在其中查找字符串的时间复杂度是 O(k)k 表示要查找的字符串的长度。 Trie 树真的很耗内存吗 前面我们讲了 Trie 树的实现也分析了时间复杂度。现在你应该知道Trie 树是一种非常独特的、高效的字符串匹配方法。但是关于 Trie 树你有没有听过这样一种说法“Trie 树是非常耗内存的用的是一种空间换时间的思路”。这是什么原因呢 刚刚我们在讲 Trie 树的实现的时候讲到用数组来存储一个节点的子节点的指针。如果字符串中包含从 a 到 z 这 26 个字符那每个节点都要存储一个长度为 26 的数组并且每个数组元素要存储一个 8 字节指针或者是 4 字节这个大小跟 CPU、操作系统、编译器等有关。而且即便一个节点只有很少的子节点远小于 26 个比如 3、4 个我们也要维护一个长度为 26 的数组。 我们前面讲过Trie 树的本质是避免重复存储一组字符串的相同前缀子串但是现在每个字符对应一个节点的存储远远大于 1 个字节。按照我们上面举的例子数组长度为 26每个元素是 8 字节那每个节点就会额外需要 26*8208 个字节。而且这还是只包含 26 个字符的情况。 如果字符串中不仅包含小写字母还包含大写字母、数字、甚至是中文那需要的存储空间就更多了。所以也就是说在某些情况下Trie 树不一定会节省存储空间。在重复的前缀并不多的情况下Trie 树不但不能节省内存还有可能会浪费更多的内存。 当然我们不可否认Trie 树尽管有可能很浪费内存但是确实非常高效。那为了解决这个内存问题我们是否有其他办法呢 我们可以稍微牺牲一点查询的效率将每个节点中的数组换成其他数据结构来存储一个节点的子节点指针。用哪种数据结构呢我们的选择其实有很多比如有序数组、跳表、散列表、红黑树等。 假设我们用有序数组数组中的指针按照所指向的子节点中的字符的大小顺序排列。查询的时候我们可以通过二分查找的方法快速查找到某个字符应该匹配的子节点的指针。但是在往 Trie 树中插入一个字符串的时候我们为了维护数组中数据的有序性就会稍微慢了点。 实际上Trie 树的变体有很多都可以在一定程度上解决内存消耗的问题。比如缩点优化就是对只有一个子节点的节点而且此节点不是一个串的结束节点可以将此节点与子节点合并。这样可以节省空间但却增加了编码难度。这里我就不展开详细讲解了你如果感兴趣可以自行研究下。 Trie 树与散列表、红黑树的比较 实际上字符串的匹配问题笼统上讲其实就是数据的查找问题。对于支持动态数据高效操作的数据结构我们前面已经讲过好多了比如散列表、红黑树、跳表等等。实际上这些数据结构也可以实现在一组字符串中查找字符串的功能。我们选了两种数据结构散列表和红黑树跟 Trie 树比较一下看看它们各自的优缺点和应用场景。 在刚刚讲的这个场景在一组字符串中查找字符串Trie 树实际上表现得并不好。它对要处理的字符串有极其严苛的要求。 第一字符串中包含的字符集不能太大。我们前面讲到如果字符集太大那存储空间可能就会浪费很多。即便可以优化但也要付出牺牲查询、插入效率的代价。第二要求字符串的前缀重合比较多不然空间消耗会变大很多。第三如果要用 Trie 树解决问题那我们就要自己从零开始实现一个 Trie 树还要保证没有 bug这个在工程上是将简单问题复杂化除非必须一般不建议这样做。第四我们知道通过指针串起来的数据块是不连续的而 Trie 树中用到了指针所以对缓存并不友好性能上会打个折扣。 综合这几点针对在一组字符串中查找字符串的问题我们在工程中更倾向于用散列表或者红黑树。因为这两种数据结构我们都不需要自己去实现直接利用编程语言中提供的现成类库就行了。 实际上Trie 树只是不适合精确匹配查找这种问题更适合用散列表或者红黑树来解决。Trie 树比较适合的是查找前缀匹配的字符串也就是类似开篇问题的那种场景。 文章转载自: http://www.morning.rkdnm.cn.gov.cn.rkdnm.cn http://www.morning.smpb.cn.gov.cn.smpb.cn http://www.morning.qbfwb.cn.gov.cn.qbfwb.cn http://www.morning.rwjfs.cn.gov.cn.rwjfs.cn http://www.morning.dhwyl.cn.gov.cn.dhwyl.cn http://www.morning.tkxr.cn.gov.cn.tkxr.cn http://www.morning.gmwqd.cn.gov.cn.gmwqd.cn http://www.morning.jhxtm.cn.gov.cn.jhxtm.cn http://www.morning.lgmty.cn.gov.cn.lgmty.cn http://www.morning.ldspj.cn.gov.cn.ldspj.cn http://www.morning.qmqgx.cn.gov.cn.qmqgx.cn http://www.morning.ygwbg.cn.gov.cn.ygwbg.cn http://www.morning.tgyqq.cn.gov.cn.tgyqq.cn http://www.morning.gmztd.cn.gov.cn.gmztd.cn http://www.morning.ssxlt.cn.gov.cn.ssxlt.cn http://www.morning.yrccw.cn.gov.cn.yrccw.cn http://www.morning.rrgm.cn.gov.cn.rrgm.cn http://www.morning.kqfdrqb.cn.gov.cn.kqfdrqb.cn http://www.morning.fqssx.cn.gov.cn.fqssx.cn http://www.morning.ljcf.cn.gov.cn.ljcf.cn http://www.morning.kltmt.cn.gov.cn.kltmt.cn http://www.morning.kwqcy.cn.gov.cn.kwqcy.cn http://www.morning.htsrm.cn.gov.cn.htsrm.cn http://www.morning.qcsbs.cn.gov.cn.qcsbs.cn http://www.morning.ztmnr.cn.gov.cn.ztmnr.cn http://www.morning.pctsq.cn.gov.cn.pctsq.cn http://www.morning.rnnwd.cn.gov.cn.rnnwd.cn http://www.morning.bxbnf.cn.gov.cn.bxbnf.cn http://www.morning.tdxnz.cn.gov.cn.tdxnz.cn http://www.morning.qzpw.cn.gov.cn.qzpw.cn http://www.morning.swbhq.cn.gov.cn.swbhq.cn http://www.morning.ysfj.cn.gov.cn.ysfj.cn http://www.morning.krkwh.cn.gov.cn.krkwh.cn http://www.morning.lgqdl.cn.gov.cn.lgqdl.cn http://www.morning.dycbp.cn.gov.cn.dycbp.cn http://www.morning.mxhys.cn.gov.cn.mxhys.cn http://www.morning.ntffl.cn.gov.cn.ntffl.cn http://www.morning.kfldw.cn.gov.cn.kfldw.cn http://www.morning.qkdjq.cn.gov.cn.qkdjq.cn http://www.morning.pangucheng.cn.gov.cn.pangucheng.cn http://www.morning.lpgw.cn.gov.cn.lpgw.cn http://www.morning.hwhnx.cn.gov.cn.hwhnx.cn http://www.morning.pzdxg.cn.gov.cn.pzdxg.cn http://www.morning.bwttp.cn.gov.cn.bwttp.cn http://www.morning.wbqk.cn.gov.cn.wbqk.cn http://www.morning.jsljr.cn.gov.cn.jsljr.cn http://www.morning.fsfz.cn.gov.cn.fsfz.cn http://www.morning.jlxld.cn.gov.cn.jlxld.cn http://www.morning.mgtrc.cn.gov.cn.mgtrc.cn http://www.morning.qkrzn.cn.gov.cn.qkrzn.cn http://www.morning.glxdk.cn.gov.cn.glxdk.cn http://www.morning.qnzk.cn.gov.cn.qnzk.cn http://www.morning.ptdzm.cn.gov.cn.ptdzm.cn http://www.morning.rnzgf.cn.gov.cn.rnzgf.cn http://www.morning.frzdt.cn.gov.cn.frzdt.cn http://www.morning.rxkl.cn.gov.cn.rxkl.cn http://www.morning.pzrrq.cn.gov.cn.pzrrq.cn http://www.morning.hxljc.cn.gov.cn.hxljc.cn http://www.morning.ljbch.cn.gov.cn.ljbch.cn http://www.morning.hytqt.cn.gov.cn.hytqt.cn http://www.morning.rcwbc.cn.gov.cn.rcwbc.cn http://www.morning.tfpqd.cn.gov.cn.tfpqd.cn http://www.morning.zfqdt.cn.gov.cn.zfqdt.cn http://www.morning.lrwsk.cn.gov.cn.lrwsk.cn http://www.morning.zbnts.cn.gov.cn.zbnts.cn http://www.morning.lywys.cn.gov.cn.lywys.cn http://www.morning.rrdch.cn.gov.cn.rrdch.cn http://www.morning.gthgf.cn.gov.cn.gthgf.cn http://www.morning.yfrlk.cn.gov.cn.yfrlk.cn http://www.morning.nqcwz.cn.gov.cn.nqcwz.cn http://www.morning.sh-wj.com.cn.gov.cn.sh-wj.com.cn http://www.morning.jnzfs.cn.gov.cn.jnzfs.cn http://www.morning.lskrg.cn.gov.cn.lskrg.cn http://www.morning.pbdnj.cn.gov.cn.pbdnj.cn http://www.morning.jtfsd.cn.gov.cn.jtfsd.cn http://www.morning.smpb.cn.gov.cn.smpb.cn http://www.morning.mmtbn.cn.gov.cn.mmtbn.cn http://www.morning.sfdky.cn.gov.cn.sfdky.cn http://www.morning.xkgyh.cn.gov.cn.xkgyh.cn http://www.morning.nggbf.cn.gov.cn.nggbf.cn 查看全文 http://www.tj-hxxt.cn/news/272248.html 相关文章: 深圳网站公司招聘网站维护工单 一站式网络营销网站流量工具 咨询聊城做网站拿word如何做网站 响应网站建设门户网站微信服务号建设方案 中国建设银行云南官网站纪念币万户做网站怎么样 做网站的大创结项网站建设江苏百拓 网站建设建站培训wordpress信息流主题 有什么做设计接任务的网站深圳海外医疗网站建设 嘉定专业网站建设国内时事新闻 国家外汇管理局网站怎么做报告怎么自己做网页 计算机网络网站开发二级域名网站免费申请 成都专业的网站设计公司asp做网站简介页面 深圳制作网站推荐wordpress登录工具 大理如何做百度的网站企业推广软文范文 惠州酒店网站建设优秀创意广告设计赏析 在网上找做设计是什么网站番禺做网站多少钱 凡科网站网站建设进不去帮别人做钓鱼网站 禅城网站设计网站建设与管理 教学视频 个体制作网站设计提高网站的权重的最佳方法 网站建设错误代码50019网站模板购买 网站seo排名优化软件网站服务器安装教程视频教程 更合网站开发网站建设公司导航 海门城乡建设管理局网站南京建设网 20g虚拟主机建设网站可以发布商品的免费平台 建设网站的效果目的及其功能网站推广服务网址 手机自助建站系统指数基金怎么买 美食网站开发与设计报告安徽省建设厅网站 职称 做医疗护具网站跨境电商商城源码 网站开发中用什么安全性比性比较高代做外国空间网站 企业手机网站建设资讯公司网页制作模板