叶子结点

算法系列:排序算法

亡梦爱人 提交于 2020-01-03 04:59:36
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明。 ----------------------------------------------------- ------------------------------------ 开始学习排序算法,此篇是总体介绍。 学习算法的入门资料当然是 算法导论 ,大家可以上 MIT 的 OCW 站看看, http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/CourseHome/index.htm , 另外还有第 3 版的笔记和 PPT, http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-006Spring-2008/CourseHome/index.htm , 这是 网易公开课地址 。 维基的资料 不能少。 以下是一些很好的博客文章: http://blog.csdn.net/hguisu/article/details/7776068 http://blog.csdn.net/v

B+树|MYSQL索引使用原则

早过忘川 提交于 2020-01-01 04:57:06
‘’MYSQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了。为什么要改成这样,之前都没有听过存储引擎,于是网上查了一下。 事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。 一、存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。 在 MySQL 中,主要有四种类型的索引,分别为: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。 B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引。Archive 引擎直到 MySQL 5.1 才支持索引,而且只支持索引单个 AUTO_INCREMENT 列。 不仅仅在 MySQL 中是如此,实际上在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检索中有非常优异的表现。 一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的 Leaf

Mysql innodb索引与查询优化

只谈情不闲聊 提交于 2020-01-01 04:53:36
一、 引言 概要 (1) innodb索引类型与B+树 (2) 索引使用注意事项 (3) 车点评业务表索引优化案例 问题 (1) InnoDb索引为什么要用b+树? (2) 聚集索引与普通索引有什么区别? (3) 为什么主键最好是自增? (4) 组合索引有什么优势? (5) 有哪些实际业务场景索引搞不定? 二、 innodb索引类型与B+树 INNODB主要有几种索引:B+树索引,自适应哈希索引,全文索引 ,覆盖索引。 B+树索引是一种多叉平衡查找树。 自适应哈希索引是mysql对于频繁查询的数据采取的hash存储优化,用户无法选择设置。 全文索引主要用于全文检索使用。 覆盖索引说的是查询的字段都属于同一个索引字段,这样效率非常高。 查找树 查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。 B 树 /B+ 树 /B* 树 B树 B+树 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 数据库索引采用B

(七)MySQL索引和执行计划

不羁岁月 提交于 2020-01-01 04:22:05
索引 和 EXPLAIN/DESC 概念 索引 是对 数据库 表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息 索引分为聚簇索引和非聚簇索引两种 聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快 MyISAM:非聚簇索引 非聚簇索引的 主索引和辅助索 引几乎是一样的,只是主索引不允许重复,不允许空值,他们 的叶子结点的key都存储指向键值对应的数据的物理地址 非聚簇索引的数据表和索引表是分开存储的 非聚簇索引中的数据是根据数据的插入顺序保存。因此非聚簇索引更适合单个数据的查询。插入顺序不受键值影响 只有在MyISAM中才能使用FULLTEXT索引 InnoDB:聚簇索引 聚簇索引的 主索引的叶子结点存储的是键值对应的数据本身,辅助索引的叶子结点存储的是键值对应的数据的主键键值 。因此主键的值长度越小越好,类型越简单越好 聚簇索引的数据和主键索引存储在一起。 聚簇索引的数据是根据主键的顺序保存。因此适合按主键索引的区间查找,可以有更少的磁盘I/O,加快查询速度。但是也是因为这个原因,聚簇索引的插入顺序最好按照主键单调的顺序插入,否则会频繁的引起页分裂,严重影响性能。 在InnoDB中

算法导论学习之——堆排序

血红的双手。 提交于 2019-12-31 02:36:34
在这一篇文章中,首先介绍一下堆的属性和性质。然后讲解一下建堆的过程,最后讲解堆排序。 1、堆的介绍 堆的物理存储结构就是一个一维的数组,其数据结构就是一个完全的二叉树。需要注意的是堆中的每个结点不需要后继指针,其父节点和左右孩子结点都可以通过计算得到。假设要计算结点i(i为数组的下标)的父节点和左右孩子结点,可以使用以下公式计算: 在此计算的都是结点的数组下标, 由于堆的数据结构是一个完全二叉树,设该完全二叉树有n个结点。则其内部结点下标分别为:1,2,。。。 故其叶子结点下标分别为: 堆高度:就是从根节点到最长叶子结点的距离。包含N个结点的堆高为: 其次是最大堆和最小堆问题,最大堆就是对任意的父节点的值总是大于或等于孩子节点的值,这样的话就能保证根节点保存堆中的最大元素。 即:A[parent(i)] >=A[i] (最大堆) 同样,最小堆就是对任意的父节点的值小于或等于孩子结点的值,这样就能保证根节点的值最小。 即:A[parent(i)] <=A[i] (最小堆) 一般情况下,最大堆用于堆排序中,最小堆用于优先队列中。 2、建堆 根据堆的性质,我们最终要得到堆的根节点是一个最值,因而,我们需要自底向上进行建堆,若自顶向下建堆的话则不能保证根节点是最值。在此仅讨论建立最大堆的情况。 首先我们可以认为每个叶子结点已经是一个最大堆,然后从最末一个非叶子结点 开始进行对调整

算法导论-堆排序

北慕城南 提交于 2019-12-31 02:36:19
堆排序的时间复杂度是 ,具有空间原址性,即任何时候都只需要常数个额外的元素空间存储临时数据。 一、堆 二叉堆是一个数组,可看成一个近似的完全二叉树,树上的每个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且是从左到右填充。 二叉堆可以分为两种形式:最大堆和最小堆。在最大堆中除根节点外所有结点i都要满足: ,即某个结点的值至多与其父结点一样大。在最小堆中除根节点外所有 结点i都要满足: 。 说明: 堆排序中,我们使用最大堆,最小堆通常用于构造优先队列。 二、维护堆的性质 函数MAX-HEAPIFY的输入为一个数组A和下标i,假定根节点为LEFT(i)和RIGHT(i)的二叉树都是最大堆,通过让A[i]的值在最大堆中逐级下降,从而使得以下标i为根结点的子树为最大堆。 函数MAX-HEAPIFY的时间代价包括:调整A[i]、A[LEFT[i]]和A[RIGHT[i]]关系的时间代价 ,加上以一颗i的一个孩子为根结点的子树上运行MAX-HEAPIFY的时间代价(假设递归调用会发生)。 下面首先证明每个子树的大小至多为2n/3。 证明: 设堆的高度为h,最后一层结点个数为m,则整个堆的结点总数为: 。 根结点的左子树结点总数为: , 根结点的右子树结点总数为: ,其中 。 当最底层恰好半满的时候, ,则 , 。 解出: , 。 因此,每个子树的大小至多为2n/3

算法导论:堆排序

拜拜、爱过 提交于 2019-12-31 02:36:09
堆 堆是一个数组,它可以被看成一个近似的完全二叉树,树上的每一个结点对应数组中的一个元素。除去最底层外,该树是完全充满的,而且从左到右填充。 用数组A表示堆,从数组第1个元素开始,数组中第i(1<=i <=n)个元素,其父结点,左孩子,右孩子的下标如下 // 父结点 public int parent( int i){ return i/2; } // 左孩子 public int left(int i){ return 2*i; } // 右孩子 public int right(int i){ return 2*i+1; } 当数组起始下标是0的时候,其父结点,左右孩子结点如下 // 父结点 public int parent( int i){ return (i-1)/2; } // 左孩子 public int left(int i){ return 2*i+1; } // 右孩子 public int right(int i){ return 2*i+2; } 堆可以分为大顶堆和小顶堆 大顶堆:结点 i 的值 都大于其左右孩子结点的值 小顶堆:结点 i 的值 都小于其左右孩子结点的值 二叉树的形式与数组形式表达堆之间元素的关系 练习1,高度为h的堆,元素最少和最多是多少? 最多:这个完全二叉树第h层元素填满:2^h - 1 最少:第h-1层填满,第h层只有一个元素:2^

树型结构的基本概念

倾然丶 夕夏残阳落幕 提交于 2019-12-30 09:02:48
转自:https://blog.csdn.net/zhangyuan19880606/article/details/51220561 树型结构的基本概念 对大量的输入数据,链表的线性访问时间太慢,不宜使用。本文探讨另外一种重要的数据结构----树,其大部分时间可以保证操作的运行平均时间复杂度为O(logN),第一部分先来看一下树的一些预备知识。 首先看一下树形结构的样子,下图代表的是树型结构的一般形态: 由上图看得出树是一些节点的集合,总结一下树的一些基本概念: 1、结点:树中的数据元素都称之为结点 2、根:最上面的结点称之为根,一颗树只有一个根且由根发展而来,从另外一个角度来说,每个结点都可以认为是其子树的根 3、父亲:结点的上层结点,如图中,结点K的父亲是E、结点L的父亲是G 4、兄弟:具有相同父亲的结点称为兄弟,图中F、G、H互为兄弟 5、结点的度:结点所拥有的子树的个数称之为结点的度,如结点B的度为3 6、树叶:度为0的结点,也叫作终端结点,图中D、K、F、L、H、I、J都是树叶 7、分支结点:度不为0的结点,也叫作非终端结点或内部结点,图中根、A、B、C、E、G都是分支结点 8、结点的层次:从根节点到树中某结点所经路径上的分支树称为该结点的层次,根节点的层次规定为1,其余结点的层次等于其父亲结点的层次+1 9、树的深度:树中结点的最大层次数,图中树的深度为4 二叉树

博客作业04--树

白昼怎懂夜的黑 提交于 2019-12-30 00:51:39
1.学习总结 1.1树结构思维导图 1.2 树结构学习体会 树是一种非线性结构,在现实中用于描述层次关系的一种结构,比如操作系统的文件系统、Internet中的DNS(域名系统)、人类的族谱等,在计算机领域中运用于编译器语法结构、数据库系统、人工智能、数据挖掘算法。在学习树结构的过程中,遇到了不少困难,对于非线性结构,刚开始接触的我还是比较难以理解,而且在树的一些操作中经常运用递归算法,而我对于递归算法还是不熟,所以经常不知道该如何解题。 2.PTA实验作业 2.1.1 题目:jmu-ds-表达式树 2.1.2 设计思路 //建树函数InitExpTree 建字符栈op,树结点栈stacktree 遍历数组str 当str[i]是操作数 建值为str[i]树结点,入树结点栈stacktree 当str[i]为运算符 while(op栈顶优先级比str[i]高) op栈顶出栈,stacktree出栈两个元素 这两个元素分别为op栈顶元素的左右孩子结点 树结点入栈 当op栈顶优先级比str[i]低 str[i]入栈 当op栈顶优先级与str[i]相等 op栈顶出栈 将op栈中还有的元素继续和树结点栈stacktree中的元素建立树 //计算表达式函数EvaluateExTree 后序遍历二叉表达式树,获得后缀表达式,存入数组postexp中 计算后缀表达式值,并返回 2.1.3

博客作业04--树

[亡魂溺海] 提交于 2019-12-30 00:51:08
1.学习总结 1.1树结构思维导图 ps:因为树的内容有点儿多所以字太小了, 单击右键点全屏观看 图片效果更佳哦~ 1.2 树结构学习体会 在本章树的学习中,可以说是掌握得特别虚。因为二叉树的很多操作中都应用到了递归,而在上学期学习递归的时候就没有掌握好,很多时候树的几个递归代码会让我沉思很久才能屡清楚整个过程,然而看懂代码和会写代码还是有很大差别的,本次的PTA在课本上可以找到很多相关的代码情况下还是完成得跌跌撞撞的,更不敢想象如果是没有遇到过的需要用递归思想完成的题目我会做得多糟糕。除此之外的二叉树的线索化和遍历的过程我还是非常懵逼的,对二叉树的非递归遍历我也掌握得不清楚。因为错过了并查集的讲解内容,所以对并查集的整个过程目前也是很虚。关于二叉树的应用,比如说赫夫曼树和赫夫曼编码目前只是掌握了手动求解,但是转换成代码来实现的话怕是也会遇到很多的困难。 2.PTA实验作业 2.1 题目1: jmu-ds-表达式树 2.2 设计思路 void InitExpTree(BTree &T,string str) { 建Op栈,Op.push('#') 初始化根节点栈,Stacktree栈 while(表达式未结束) { if(ch==操作数) 生成一个只有根节点的子树T Stacktree.push(T) if(ch==运算符) { while(ch<op栈顶运算符) 栈顶优先级高,则