叶子结点

B树、B-树、B+树、B*树

风流意气都作罢 提交于 2020-03-23 15:21:41
B树 即 二叉搜索树 : 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字; (平衡二叉搜索树的优势) 如果 B 树的所有非叶子结点的左右子树的结点数目均保持差不多( 平衡 ),那么 B 树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是 常数开销 ; 如: 但B树在经过多次插入与删除后,有可能导致不同的结构: 右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题; 实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在B树中插入和删除结点的策略; B-树 是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2

mysql数据库面试总结

喜你入骨 提交于 2020-03-23 04:59:04
数据库优化 建表优化 1)数据库范式 l 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 如电话列可进行拆分---家庭电话、公司电话 l 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。 l 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。 比如 Student 表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话) 这样一个表结构,就存在上述关系。 学号 --> 所在院校 --> ( 院校地址,院校电话 ) 这样的表结构,我们应该拆开来,如下。 (学号,姓名,年龄,性别,所在院校) -- (所在院校,院校地址,院校电话) 满足这些规范的数据库是简洁的、结构明晰的;同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。 2)数据类型选择 l 数字类型 Float 和 double 选择(尽量选择 float ) 区分开TINYINT / INT / BIGINT,能确定不会使用负数的字段,建议添加 unsigned定义 能够用数字类型的字段尽量选择数字类型而不用字符串类型的 l 字符类型 char,varchar,TEXT的选择:非万不得已不要使用 TEXT 数据类型,定长字段,建议使用

空间索引 - 四叉树

 ̄綄美尐妖づ 提交于 2020-03-22 11:39:10
/*--> */ /*--> */ /*--> */ /*--> */ /*--> */ /*--> */ 前言 作为程序员,应该都对二叉树都不陌生,我们都知道二叉树的变体二叉查找树,非常适合用来进行对一维数列的存储和查找,可以达到 O(logn) 的效率;我们在用二叉查找树进行插入数据时,根据一个数据的值和树结点值的对比,选择二叉树的两个叉之一向下,直到叶子结点,查找时使用二分法也可以迅速找到需要的数据。 但二叉树只支持一维数据,如一个标量数值,对地图上的位置点这种有xy两个方向上的信息却无能为力,那么是否有一种树能够支持二维数据的快速查询呢? 四叉树 介绍 四元树又称四叉树是一种树状数据结构,在每一个节点上会有四个子区块。四元树常应用于二维空间数据的分析与分类。它将数据区分成为四个象限。 今天要介绍的四叉树可以认为是二叉查找树的高维变体,它适合对有二维属性的数据进行存储和查询,当然四叉树存储的也不一定是二维数据,而是有着二维属性的数据,如有着 x,y 信息的点,用它还可以用来存储线和面数据。它有四个 叉 ,在数据插入时,我们通过其二维属性(一般是 x,y)选择四个叉之一继续向下,直至叶子结点,同样使用“四分法”来迅速查找数据。四叉树的一般图形结构如下: 聪明的小伙伴一定想到了适合存储和查询三维数据的八叉树,它们原理是一致的,不过我们暂不讨论。 分类 四叉树常见的应用有图像处理

数据结构--树形结构

狂风中的少年 提交于 2020-03-22 05:10:30
今天在博客上看到这样一段代码,感觉挺有意思,代码如下: 1 public class Edge { 2 //Name of origin town 3 public Node origin; 4 //Name of destination town 5 public Node destination; 6 //Route weight to destination 7 public int weight; 8 //next possible route 9 public Edge next; 10 //constructor 11 public Edge(Node origin, Node destination, int weight) { 12 this.origin = origin; 13 this.destination = destination; 14 this.weight = weight; 15 this.next = null; 16 } 17 18 public Edge next(Edge edge) { 19 this.next = edge; 20 return this; 21 } 22 } 23 24 graph.routeTable.put(a, new Edge(a, b, 5).next(new Edge(a, d, 5).next(new

dTree无限级目录树和JQuery同步ajax请求

五迷三道 提交于 2020-03-21 10:04:36
3 月,跳不动了?>>> 以前都是用JQuery对树的支持来实现目录树的,近来闲来无事就弄了下dTree,感觉其无限级目录还是挺好的,而且它的使用也比较方便,基本上 就是先把要用的js文件即dtree.js和css文件dtree.css引入,另外就是它默认的图片,当然这些图片都是可以自己指定的,它的css样式 也可以自己改变的! 关于dTree就先谈谈它的node,dTree的node的构造方法可以指定下列参数, id //唯一标识,数字型 pid//父节点的id,如果是根结点那就只能是-1,一般来讲只有一个最顶层的根结点 name//结点的名字,字符串类型,在页面上显示出来的标签. url//字符串类型,表示当点击该叶子结点的时候访问哪个URL. title//title,字符串类型,鼠标进入时显示的字符串. target//字符串类型,超链接的目标位置. icon //字符串类型,表示该结点图标的图片路径,不指定则使用默认的 iconOpen//结点打开时候的图片路径,不指定则使用默认的 open//boolean类型,表示初始状态是否是打开的 mytree.add(1, 0, 'My node', 'node.html', 'node title', 'mainframe', 'img/musicfolder.gif'); 有了node以后就是构建树了 //引入了dtree

哈夫曼树应用——九度OJ题目1107:搬水果

巧了我就是萌 提交于 2020-03-19 08:42:55
哈夫曼算法 1、将所有结点放入集合K。 2、若集合K中剩余结点大于2个,则取出其中权值最小的两个结点,构造他们同时为某个新节点的左右儿子,该新节点是他们共同的双亲结点,设定它的权值为其两个儿子结点的权值和。并将该父亲结点放入集合K。重复步骤2或3。 3、若集合K中仅剩余一个结点,该结点即为构造出的哈夫曼树数的根结点,所有构造得到的中间结点(即哈夫曼树上非叶子结点)的权值和即为该哈夫曼树的带权路径和。 注:使用STL中的优先队列priority_queue可以很容易地实现哈夫曼树,详情见例题。 题目1107:搬水果 题目描述: 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆。每一次合并,小明可以把两堆水果合并到一起,消耗的体力等于两堆水果的重量之和。当然经过 n‐1 次合并之后,就变成一堆了。小明在合并水果时总共消耗的体力等于每次合并所耗体力之和。 假定每个水果重量都为 1,并且已知水果的种类数和每种水果的数目,你的任务是设计出合并的次序方案,使小明耗费的体力最少,并输出这个最小的体力耗费值。例如有 3 种水果,数目依次为 1,2,9。可以先将 1,2 堆合并,新堆数目为3,耗费体力为 3。然后将新堆与原先的第三堆合并得到新的堆,耗费体力为 12。所以小明总共耗费体力=3+12=15,可以证明 15 为最小的体力耗费值。 输入

B+树索引

ぃ、小莉子 提交于 2020-03-19 00:18:19
结构上 B树中关键字集合分布在整棵树中,叶节点中不包含任何关键字信息,而B+树关键字集合分布在叶子结点中,非叶节点只是叶子结点中关键字的索引; B树中任何一个关键字只出现在一个结点中,而B+树中的关键字必须出现在叶节点中,也可能在非叶结点中重复出现; 性能上(也即为什么说B+树比B树更适合实际应用中 操作系统 的文件索引和 数据库 索引?) 不同于B树只适合随机检索,B+树同时支持随机检索和顺序检索; B+树的磁盘读写代价更低。B+树的内部结点并没有指向关键字具体信息的指针,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写次数也就降低了。而IO读写次数是影响索引检索效率的最大因素。 B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。而在B+树中,顺序检索比较明显,随机检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。 (数据库索引采用B+树的主要原因是,)B-树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历

数据结构之二叉排序树

心已入冬 提交于 2020-03-18 14:31:18
某厂面试归来,发现自己落伍了!>>> 概念: 二叉搜索树是一种节点值之间具有一定数量级次序的二叉树。对于树中的每个节点: 若其左子树存在,则其左子树中每个节点的值都不大于该节点的值。 若其右子树存在,则其右子树中每个节点的值都不小于该节点的值。 该节点的左右子树都是二叉搜索树。 没有键值相等的节点。 public class BSTree<T extends Comparable<T>> { private BSTNode<T> mRoot; @Data public class BSTNode<T extends Comparable<T>> { T key; BSTNode<T> left; BSTNode<T> right; BSTNode<T> parent; public BSTNode() { super(); } public BSTNode(T key, BSTNode<T> left, BSTNode<T> right, BSTNode<T> parent) { this.key = key; this.left = left; this.right = right; this.parent = parent; } } } 前驱与后继: 前驱:该节点左子树中最大的节点。数值紧挨着小于的值。 public BSTNode<T> predecessor(BSTNode

B树,B+树,B*树简介

限于喜欢 提交于 2020-03-17 03:00:15
B树(有些人也叫B-树) 是一种多路搜索树 : 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2.根结点的儿子数为[2, M]; 3.除根结点以外的非叶子结点的儿子数为[M/2, M]; 4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字) 5.非叶子结点的关键字个数=指向儿子的指针个数-1; 6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]; 7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的 子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树; 8.所有叶子结点位于同一层; 如:(M=3) B树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果 命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为 空,或已经是叶子结点; B树的特性: 1.关键字集合分布在整颗树中; 2.任何一个关键字出现且只出现在一个结点中; 3.搜索有可能在非叶子结点结束; 4.其搜索性能等价于在关键字全集内做一次二分查找; 5.自动层次控制; 由于限制了除根结点以外的非叶子结点,至少含有M/2个儿子,确保了结点的至少 利用率,其最底搜索性能为: 其中

数据结构与算法基础 模块二

别说谁变了你拦得住时间么 提交于 2020-03-13 07:34:38
那么在上一次的分享中,针对链表和顺序表进行了比较,也对于他们二者进行了基础性的分析和说明,那么在模块二中,紧接着上一次的分享,说明一下栈,队列和树的相关知识。 栈 栈的关键主要是记住: 先进后出 (可以形象的比喻为洗盘子,先洗的盘子放在最下面,放的时候一个一个放,最先洗完的最后放进碗橱) 并且我们需要明确,栈只是一个逻辑上的概念,并非是实际存在的,并且,出栈的顺序是灵活的,并不是固定的一定是按照进来的顺序走,有可能是进一个出一个,也有可能是全部进来再出,所以,我们要明确不能死记栈的概念,而是要灵活的运用。 队列 队列的关键是: 先进先出 (可以形象的比喻成在银行排队取钱,先进去的人排在队伍的前面,完成取钱任务后,先出门) 队列和栈两者有一个很明显的区别,就是出的顺序,所以在记忆的时候,我们可以组合在一起记忆,并且将他们各自都形象的记忆,这样有利于我们区分两者之间的关系,也有利于我们记忆。 那么,队列中还包括循环队列 :在判断循环队列空的条件:head=tail 这个式子也可以表示队满的情况, 但也有这种可能,就是他的尾指针并没有和他的头指针存在一个地址里,为了区分开来,头地址和尾地址之间还存在一个地址,即其队满的条件是:tail+1=head 树 首先,我们在说明树的一些问题的时候,我们需要明确有关于树的相关基本概念: 1、节点的度 (就看与下一层与几个结点相关联) 2、树的度