数据结构《17》---- 自动补齐之《二》----Ternary Search Tree
一、 序言
上一篇文章中,给出了 trie 树的一个实现。可以看到,trie 树有一个巨大的弊病,内存占用过大。
本文给出另一种数据结构来解决上述问题---- Ternary Search Tree (三叉树)
二、数据结构定义
Trie 树中每个节点包含了 26 个指针,但有很大一部分的指针是 NULL 指针,因此浪费了大量的资源。
一种改进措施就是,以一棵树来代替上述的指针数组。
节点定义如下:
一个节点代表了一个字母,左孩子的字母小于当前节点,右孩子的字母大于当前节点。
同时每个节点包含一个标记:指出当前节点是否是单词的结尾。
如下图:
这个图很容易理解错。我详细讲解以下。
首先,根节点是 A, 以 A 为开头的单词都在 中子树中;
左子树表示那些首字母 < A 的单词集合;
中子树表示那些首字母 = A 的单词集合;
右子树表示那些首字母 > A 的单词集合;
黄色表示单词的结尾;
下图中包含以下单词: AB ABCD ABBA BCD
三、与 Trie 树的比较
当建立一个 7000+ 的词典时,
1. Trie 树共消耗了大约 22383 * 27 * 4 BYTE = 2.4 M
2. Ternary Tree 共消耗了 22468 * 14 BYTE = 0.31M
可以看出,在内存占用方面 Ternary Tree 较 Trie 树有着巨大的优势。
四、代码
数据结构《17》---- 自动补齐之《二》----Ternary Search Tree的更多相关文章
- 数据结构《17》---- 自己主动补齐之《二》----Ternary Search Tree
		一. 序言 上一篇文章中,给出了 trie 树的一个实现. 能够看到,trie 树有一个巨大的弊病,内存占用过大. 本文给出还有一种数据结构来解决上述问题---- Ternary Search Tre ... 
- 数据结构《16》----自动补齐实现《一》----Trie 树
		1. 简述 Trie 树是一种高效的字符串查找的数据结构.可用于搜索引擎中词频统计,自动补齐等. 在一个Trie 树中插入.查找某个单词的时间复杂度是 O(len), len是单词的长度. 如果采用平 ... 
- PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
		一.数字补0. 如果要自动生成学号,自动生成某某编号,就像这样的形式“d0000009”.“d0000027”时,那么就会面临一个问题,怎么把左边用0补齐成这样8位数的编码呢?我想到了两种方法实现这个 ... 
- CocoaPods 导入第三方库头文件自动补齐
		使用了一段时间CocoaPods来管理Objective-c的类库,方便了不少.但是有一个小问题,当我在xcode输入import关键字的时候,没有自动联想补齐代码的功能,需要手工敲全了文件名,难以适 ... 
- 为Debian/Ubuntu的apt-get install添加自动补齐/完成功能
		Debian/Ubuntu的apt-get太常用了,不过偶尔可能也会碰到不太熟悉,想不起来的包的名称,除了去debian packages去查找,另外的方法就是给Debian/Ubuntu添加自动补齐 ... 
- jquery.autocomplete自动补齐和自定义格式
		1.简单的下拉自动补齐,可以使用本地或远程数据源 <input name="autoTag" id="autoTag" /> var source ... 
- HTML5的数据自动补齐功能
		使用datalist元素,HTML5允许使用一组数据来生成自动补齐功能,现在你不需要使用第三方js代码或者类库啦! <input name="frameworks" list ... 
- Android Studio-设置switch/case代码块自动补齐
		相信很多和我一样的小伙伴刚从Eclipse转到Android Studio的时候,一定被快捷键给搞得头晕了,像Eclipse中代码补齐的快捷键是Alt+/ ,但是在AS中却要自己设置,这还不是问题的关 ... 
- CocoaPods导入第三方库头文件自动补齐
		使用了一段时间CocoaPods来管理Objective-c的类库,方便了不少.但是有一个小问题,当我在xcode输入import关键字的时候,没有自动联想补齐代码的功能,需要手工敲全了文件名,难以适 ... 
随机推荐
- 50道 Sql语句题
			Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 ... 
- Gerald's Hexagon
			Gerald's Hexagon Gerald got a very curious hexagon for his birthday. The boy found out that all the ... 
- Linux下搭建DNS服务器
			1. 安装需要的软件 由于实验过程是在自己电脑进行的,所以需要安装bind bind-chroot,以下为安装过程. 图1-1 安装bind 图1-2 安装bind-chroot 2.修改DNS主配置 ... 
- innodb 存储引擎特性
			使用独立表空间后,系统表空间存储什么内容呢? 1.innodb 数据字典信息 和存储引擎相关. frm 是服务器的数据字典和存储引擎无关. 2. undo 回滚段. 可以单独存储. ... 
- winform webbrowser flash显示
			string flashSrc = "e:\\t.swf"; StringBuilder sb = new StringBuilder(); sb.Append("< ... 
- Centos 6.5 安装 ionCube PHP Loader
			使用某些php的程序的时候会出现提示:Site error: the file /***/index.php requires the ionCube PHP Loader ioncube_loade ... 
- QT  做软件盘
			最近搞了一个组织细胞脱水机项目,当然,对于国内的项目都是仿来仿去的,我们也不例外,开启被仿机器后,第一个看到的界面就是用户登录界面,需要输入中文,作为一个程序员,我的第一反应就是我需要采用什么用的框架 ... 
- 部署私有的Nuget服务器
			1.查看官方的部署文档:http://docs.nuget.org/Create/Hosting-Your-Own-NuGet-Feeds 2.使用开源的项目:https://github.com/h ... 
- socket.io与redis构建实时推送
			准备工作 1:准备nodejs环境 2:使用npm工具安装 socket.io npm install socket.io 3:下载客户端socket.io文件 解压附件中的文件 node app. ... 
- 使用Word发表博客
			使用浏览器编辑博客,会让你感到非常不方便,如果在没有网络的时候,就不能打开编辑器页面了,只能先写在word或其他编辑软件中.可以设置word使用word编辑并直接发布到博客. 文件 - 新 ... 
