键树查找基本内容介绍
问题简介:
键树,又称数字查找树。它是一棵度>=2的树,树中的每个结点只含有组成关键字的某个符号。例如,如果关键字是数值,则一个结点中只包含一个数位;若关键字是单词,则一个结点只包含一个字母。每个完整的关键字都是从根节点到叶子结点所经过的所有结点的组合。这种特殊的树会给某些类型的关键字的表的查找带来方便。
示意图:
例如,一组单词集合为{CAR,CAT,CAKE,LIKE,LIE,WHEN,WE},则根据键树的定义,先将首字母相同的单词进行组合:{{CAR,CAT,CAKE} , {LIE,LIKE} , {WE,WHEN}}
若所得子集的关键字多余一个,则还需按照后一个字母继续分割,知道每个小子集只包含一个关键字。最后所得结果如图所示:
为了操作方便,我们规定键树在同一层中符号从左到右有序,并且结束符$小于任何字符。
键树的储存结构
键树有两种储存结构,分别是以树的孩子兄弟链表来表示的双链树,和以多重链表来表示的Trie树。
双链树
此时每个分支节点有三个域:symbol域,用于存储当前的字符;first域,用于指向第一棵子树的根的指针;next域,用于指向右兄弟的指针。同时,叶子结点还有一个单独的infoptr域,用于储存指向该关键字记录的指针。
储存结构代码:
#define MAXKEYLEN 16 //关键字的最大长度
typedef struct{char ch[MAXKEYLEN]; //关键字int num; //关键字的长度}KeysType; //关键字的类型typedef enum {LEAF, BRANCH} Nodekind; //结点种类,分为叶子和分支
typedef struct DLTNode{char symbol;struct DLTNode *next; //指向兄弟结点NodeKind kind;union{Record *infoptr; //叶子结点的记录指针struct DLTNode *first; //指向孩子结点}}DLTNode, *DLTree;
进行查找时,按照如下规则执行:假设需要查找的关键字为K.ch(0...n-1),其中K.ch[0]到K.ch[n-2]代表关键字所含的n-1个字符,而K.ch[n-1]为结束符$。从双链树的根节点出发,顺着first域查找当前结点的第一颗子树的根节点,比较K.ch[i]与当前symbol域的值是否相同,如果相同,则继续将指针移到下一个first域,否则,则通过next域查找兄弟结点。若直至兄弟结点查找完都为不等,则查找失败。
查找算法代码:
Record *SearchDLtree(DLTree T,KeyType K){ DLTree p=T->first; //指针指向第一个结点int i=0;while(p && i<K.num){while(p&&p->symbol!=K.ch[i]) p=p->next; //查找关键字的第i位if(p && i<K.num-1) p=p->first; 当前位查找到,准备查找下一位i++;}if(!p) return NULL; //查找成功else return p->infoptr; //查找失败
}
Trie树
Trie树又称字典树,树里的每个节点都含有d个指针域。
其中,d表示最大度,它域关键字的类型有关。如果关键字由字母组成,则d为26个字母加上一个$结束符等于27,同样道理得,数字的d为11。
若从Trie树的某个节点到叶子结点的路径上每个结点都只有一个孩子,则将该路径上的所有结点压缩成一个叶子节点,且在该叶子节点中存储关键字及指针等信息。
储存结构代码:
typedef struct TrieNode{NodeKind kind;union{struct{KeysType K;Recond *infoptr;} lf; //叶子结点struct{TrieNode *ptr[27];int num;} bh; //分支结点};
}TrieNode,*TrieTree;
查找时,从根节点出发,沿着对应的指针逐层向下,直到叶子结点,若叶子节点的关键字与给定值线条灯,则成功查找。若叶子节点中的关键字和给定值不相等或分支节点中和给定值相应的指针为空,则不成功。
查找算法代码:
Record *SearchTrie(TrieTree T,KeysType K){
for(p=T,i=0;p && p->kind==BRANCH && i<K.num; //p为分支节点p=p->bh.ptr[ord(K.ch[i])],++i); //ord求字符在字母表中的序号if(p && p->kind==LEAF&&p->lf.K==K) //查找成功return p->lf.infoptr; //查找失败else return NULL;}
以上就是关于键树查找的简单介绍
键树查找基本内容介绍相关推荐
- android dts配置_AndroidLinux关于DTS设备树源码的介绍
Android&Linux关于DTS设备树源码的介绍 Device tree是一种简单的节点和属性的树形结构.属性是键值对,而节点可能包括属性和子节点.画一颗电路板上CPU.总线.设备组成的树 ...
- b 树查找时间复杂度_你心里是没点B树吗?
点击上方"零一视界",选择"星标"公众号 资源干货,第一时间送达 1 引言 数据库的增删改查等操作是开发过程中最为常见也是尤为重要的,尤其是现在大数据的兴起,导 ...
- trie树查找前缀串_Trie数据结构(前缀树)
trie树查找前缀串 by Julia Geist Julia·盖斯特(Julia Geist) A Trie, (also known as a prefix tree) is a special ...
- b 树查找时间复杂度_心里没点 B 树。。。
B 树和红黑树的动画小吴还在制作当中,比想象中的复杂好多好多好多,今天先来一个图解版的 B 树... 1 引言 数据库的增删改查等操作是开发过程中最为常见也是尤为重要的,尤其是现在大数据的兴起,导致数 ...
- 数据结构与算法(Java版) | 本套系列教程的内容介绍
文章目录 本套系列教程的内容介绍 第一章节:内容介绍和授课方式 第二章节:数据结构与算法的介绍 第三章节:稀疏数组和队列 第四章节:链表 第五章节:栈 第六章节:递归 第七章节:排序算法 第八章节:查 ...
- 许键树:华为云视频直播在各细分场景的体验指标优化实践
点击上方"LiveVideoStack"关注我们 本文来自华为云媒体服务直播产品经理 许键树在LiveVideoStack公开课的分享,结合华为云在直播领域的实践经验,详细解析如何 ...
- 设计模式相关内容介绍
1.设计模式相关内容介绍 1.1. 设计模式概述 创建型模式--------买建筑材料 用于描述------怎样创建对象,它的主要特点是----------将对象的创建与使用分离,这样可以降低系统的耦 ...
- jQuery实现页内查找相关内容
2019独角兽企业重金招聘Python工程师标准>>> 当需要在页面中查找某个关键字时,一是可以通过浏览器的查找功能实现,二是可以通过前端脚本准确查找定位,本文介绍通过jQuery实 ...
- 【组队学习】【24期】Datawhale组队学习内容介绍
第24期 Datawhale 组队学习活动马上就要开始啦! 本次组队学习的内容为: 零基础入门语音识别(食物声音识别) Docker教程 数据挖掘实践(智慧海洋) 集成学习(中) 河北邀请赛(二手车价 ...
最新文章
- weui移动商城源码.zip_商城网站建设二次开发需要多久?难度大吗?
- java 文件保存目录结构_java web 实现文件夹上传(保留目录结构)
- 怎么避免UpdateData()函数弹出对话框
- AT4378-[AGC027D]ModuloMatrix【构造】
- SpringMVC遇到的问题——GET http://localhost/spring_mvc_war_exploded/js/jquery-3.3.1.js net::ERR_ABORTED 404
- c++ ea 代码 生成_EA公司教AI制作游戏角色,行动流畅自然,全程无需人类介入
- Android仿新浪微博弹出界面动画,Android仿新浪微博个人信息界面及其他效果
- 印象笔记 还回快捷_搭配这9款实用的第三方工具,小白也可以玩转印象笔记
- 什么是计算机剪贴板介绍,剪贴板功能介绍
- 十大排序算法Java
- 应用代码(4)——基于ADS1110芯片的高精度温度(PT1000)采集
- Noob 靶场渗透记录
- 【Vue知识点- No5.】生命周期、axios、购物车案例
- vim模式下报错E37: No write since last change No write since last change for buffer “ “
- 腾讯音乐2020年报:懒人听书收购完成,谢振宇、太盟投资减持
- Excel PivotTable 使用心得手顺分享(四)
- [攻防世界]getit
- Startup攻略秘籍,从头到尾,一篇搞定!
- 【读书笔记】《学会提问》——受用一生的批判性思维
- 支持小米java文件阅读器_小米开源文件管理器MiCodeFileExplorer-源码研究(0)-初步研究...