数据结构《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,码迷,mamicode.com

时间: 2024-10-19 14:54:59

数据结构《17》---- Ternary Search Tree的相关文章

Ternary Search Tree C++实现

问题描述: 1.Ternary Search Tree较之于Trie Tree也是一种前缀树(prefix tree),主要用于存储字符串,再对大量字符串进行查询和存储(insert)操作时有非常好的性能: 2.Ternary Search Tree vs Trie Tree有更好的空间效率:所占内存更少,对于存储相同的字符串集: 3.Ternary Search Tree每个节点有三个指针,分别指向小于,等于,大于此节点值(字符串中的一个字符)的各个孩子节点: 4.Ternary Search

Ternary Search Tree 应用--搜索框智能提示

前面介绍了Ternary Search Tree和它的实现,那么可以用Ternary Search Tree来实现搜索框的只能提示,因为Ternary Search Tree的前缀匹配效率是非常高的,总体思路如下(其中很多可以根据自己的需要修改,我只是写出我的做法): 比如搜索歌曲时智能提示: 建立Ternary Search Tree 将所有歌曲名的字符串放置在一个map中,key为歌曲名.value存储歌曲信息,可以是一个类对象domain,在这里可以按照key值将相同歌曲的播放次数累加,并

Ternary Search Tree Java实现

/** * @author Edwin Chen * */ //定义节点 class Node { //存储字符串 char storeChar; //是否完成单词 boolean isComplete; Node leftChild,centerChild,rightChild; //构造方法 public Node(char storeChar,boolean isComplete) { this.storeChar = storeChar; this.isComplete = isComp

Trie和Ternary Search Tree介绍

Trie树 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie树与二叉搜索树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀(prefix),也就是这个节点对应的字符串,而根节点对应空字符串.一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值. Trie树可以利用字符串的公共前缀来节约存储空间,如下图所示,该Trie树

Ternary Search Trees 三分搜索树

经常碰到要存一堆的string, 这个时候可以用hash tables, 虽然hash tables 查找很快,但是hash tables不能表现出字符串之间的联系.可以用binary search tree, 但是查询速度不是很理想. 可以用trie, 不过trie会浪费很多空间(当然你也可以用二个数组实现也比较省空间). 所以这里Ternary Search trees 有trie的查询速度快的优点,以及binary search tree省空间的优点. 实现一个12个单词的查找 这个是用二

数据结构-二叉搜索树(Binary Search Tree)的C++实现模板

笔者最近开始学习了二叉树这种数据结构,于是写出了一个二叉树的实现~ 二叉树真是个好东西 =.= 该图显示了在二叉树中插入一个节点的步骤...下面就用这个二叉树做测试好了 /** "BST.h"  * The Binary Search Tree Data Structure in C++  * Time Cost : Inorder / Preorder / Postorder Traversal : O(n)  *             Search / Find / Insert

数据结构--图(中)--树之习题选讲Complete Binary Search Tree

Complete Binary Search Tree 完全 二叉 搜索数 题意理解 二叉搜索数 左小右大 完全二叉树 结构规律 完全二叉搜索数 到底用什么数据结构来表示这个树呢?链表还是数组. 1.由于是完全二叉树,所以我们能准确的算出来左子树有多少个结点.   完全二叉树+n个树 -> 左子树的个数 2.左子树的个数能推出根节点的大小,左子树4个,那么根节点一定是第5位数 左子树的个数->根节点的值 3.这个思维:当我们确定了根节点之后,我们可以很容易的通过递归来确定其他的结点      

Trie tree 和 Ternary search 比较

Trie tree (字典树) 优点: 高效 缺点: 耗内存 Ternary search (结合Trie tree 和 二叉搜索树的各自优点,节省了内存,降低了效率) 简介: 三叉搜索树,左右两叉用于指引key大小的走向,中间叉表示与当前字符相等 优点: 节省内存 缺点: 没有Trie tree 高效,且插入顺序严重影响效率

【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)

目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中后序遍历,而这篇文章将是在二叉树的基础上来展开讲解的二叉搜索树,也就是说二叉搜索树建立在树的基础之上.至于博主为何要花一整篇文章来讲这个二叉搜索树呢?原因很简单,红-黑树是基于二叉搜索树的,如果对二叉搜索树不了解,那还谈何红-黑树?红-黑树的重要性我想各位没吃过佩奇肉也肯定看过宜春跑....是的,j