- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十二章 高级树结构 任课教员:张 铭 /mzhang/DS/ mzhang@ 北京大学信息科学与技术学院 网络与信息系统研究所 ?版权所有,转载或翻印必究 主要内容 12.1 Trie和Patricia 结构 12.2 改进的BST 最佳二叉搜索树 AVL树 伸展树 12.3 空间树结构 12.4 决策树和博弈树 12.1Trie结构和Patricia树 BST(二叉搜索树)不是一棵平衡的树,它的树结构与输入数据的顺序有很大的关系 对象空间( object space )分解 BST是一种组织上基于对象空间( object space )分解的数据结构 空间分解是存储在树中的对象(关键码值)决定 最简单的方法就是对对象(这里是关键码)的范围进行划分 平均划分 按照某种方式不平均划分 假设划分因子为2 每次仅把当前范围分为两部分(对应于二叉树) 在进行插入的时候,只要是小于结点的关键码的都在左子树中 只要是大于结点的关键码的都在右子树中 关键码空间(key space)分解 不依赖于关键码的插入顺序 树的深度受到关键码精度的影响 最坏的情况下,深度等于存储关键码所需要的位数 例如,如果关键码是0到255之间的整数,那么关键码的精度就是8个二进制位。 如果有两个关键码10000011,它们的前面7位都是相同的 所以直到第8次划分才能将这两个关键码分开 这样的搜索树深度也为8,但这是最坏的情况 基于关键码范围的分解 保证平衡吗? 显然是不行的 如果关键码的分布得很不均衡,将导致树的结构失衡 一种极端的情况,导致所有的关键码都小于根结点,那么以该结点为根的子树的右子树将没有任何的元素 Trie结构 基于关键码分解的数据结构,叫作Trie结构 “trie”这个词来源于“retrieval” 主要应用 信息检索(information retrieval) 用来存储英文字符串,尤其大规模的英文词典 自然语言理解系统中经常用到 Trie结构的适用情况 Trie结构主要基于两个原则 有一个固定的关键码集合 对于结点的分层标记 如果所有的元素都可以使用数字或者字母等来标记,那么就可以考虑使用Trie结构 例如,元素可以用0-9的数字来标记 在根结点的地方,它分出10个子结点,分别标记0-9 然后每个子结点又可以分出10个结点 如此下去直到所有的元素都能够被区分开 Trie结构特点 与B+树一样,基于关键码空间分解的树结构,其内部结点仅作为占位符引导检索过程,数据纪录只存储在叶结点中 Huffman编码树( Huffman coding tree )也是一种二叉Trie树 Trie结构示意图 Trie结构 应用:“字符树” 存储字典里面的单词 英文的单词是有26个字母组成的(简单起见,我们忽略大小写), 英文字符树每一个内部结点都有26个子结点 树的高度为最长字符串长度 英文字符树 一棵子树代表具有相同前缀的关键码的集合。例如“an”子树代表具有相同前缀an-的关键码集合{and,ant} 字符树的改进 由于单词可能不等长 ,所以更好的存储是其内部结点不存储单词信息,只有叶结点才存储单词信息 字符树的改进(续) 观察上图中的bad和bee两个单词,它们的父结点都只有一个儿子就是它们自己,也就是说,实际上它们在父结点的时候就已经被区分开了 因为我们真正想做的是要检索每一个单词,不需要在已经能够区分每个单词的情况下继续进行分裂结点的动作 字符树的改进(续) 字符树中的检索 首先用待查关键码的第一个字符与树林的各个根的字符相比较 然后下一步的检索在前次比较相等的那棵树上进行其中,用待查关键码的第二个字符与选定的这棵树的根的各个子结点进行比较, 接着再沿着前次比较相等的分支进行进一步的检索 ... 直到进行到某一层,该层所有结点的字符都与待查关键码相应位置的字符不同,这说明此关键码在树目录里没有出现; 若检索一直进行到树叶,那么就在树目录里找到了给定的关键码 Trie字符树的缺陷 Trie结构显然也不是平衡的 在它存取英文单词的时候,显然t子树下的分支比z子树下的分支多很多(以t开头的单词比以z开头的单词多很多) 而且,每次有26个分支因子使得树的结构过于庞大,给检索也带来了不便 字母在计算机中是以二进制ASCII码的形式存储的 使用每个字母的二进制编码来代表这个字母 关键码就只有编码0和1 而不是a到z的26个字母 二叉Trie树 Trie树的插入 Trie树的插入 首先根据插入纪录的关键码找到需要插入的结点位置 如果该结点是叶结点,那么就将为其分裂出两个子结点,分别存储这个纪录和以前的那个纪录 如果是内部结点,则在那个分支上应该是
文档评论(0)