叶子结点

从原理到优化,深入浅出数据库索引

爷,独闯天下 提交于 2020-02-26 02:08:32
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化,这篇文章对索引做一个系统的梳理,希望对大家有帮助。 一、MySQL有哪些索引类型 索引的分类可以从多个角度进行,下面分别从数据结构,物理存储和业务逻辑三个维度进行划分。 1、从数据结构角度 (1)B+树索引(O(log(n))) 关于B+树索引,后面会深入解析 (2)hash索引 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 只有Memory存储引擎显示支持hash索引 (3)FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 (4)R-Tree索引 用于对GIS数据类型创建SPATIAL索引 2、从物理存储角度 (1)聚集索引(clustered index) 正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引; Innodb存储引擎中行记录就是按照聚集索引维度顺序存储的,Innodb的表也称为索引表;因为行记录只能按照一个维度进行排序

8. 二叉树的下一个结点(剑指 Offer 题解Java版)

╄→гoц情女王★ 提交于 2020-02-25 19:14:13
文章目录 8. 二叉树的下一个结点 题目链接 题目描述 解题思路 代码实现 8. 二叉树的下一个结点 题目链接 牛客网 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回 。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; // 指向父结点的指针 TreeLinkNode(int val) { this.val = val; } } 解题思路 我们先来回顾一下中序遍历的过程:先遍历树的左子树,再遍历根节点,最后再遍历右子树。所以最左节点是中序遍历的第一个节点。 void traverse(TreeNode root) { if (root == null) return; traverse(root.left); visit(root); traverse(root.right); } ① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; ② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 1.有右子树的,它的下一个是右子树的最左子节点。

LOJ #2537. 「PKUWC 2018」Minimax (线段树合并 优化dp)

那年仲夏 提交于 2020-02-25 05:38:34
题意 小 \(C\) 有一棵 \(n\) 个结点的有根树,根是 \(1\) 号结点,且每个结点最多有两个子结点。 定义结点 \(x\) 的权值为: 1.若 \(x\) 没有子结点,那么它的权值会在输入里给出, 保证这类点中每个结点的权值互不相同 。 2.若 \(x\) 有子结点,那么它的权值有 \(p_x\) 的概率是它的子结点的权值的最大值,有 \(1-p_x\) 的概率是它的子结点的权值的最小值。 现在小 \(C\) 想知道,假设 \(1\) 号结点的权值有 \(m\) 种可能性, 权值第 \(i\) 小 的可能性的权值是 \(V_i\) ,它的概率为 \(D_i(D_i>0)\) ,求: \[\displaystyle \sum _{i=1} ^ {m} i \cdot V_i \cdot D_i^2\] 你需要输出答案对 \(998244353\) 取模的值。 对于 \(40\%\) 的数据,有 \(1\leq n\leq 5000\) ; 对于 \(100\%\) 的数据,有 \(1\leq n\leq 3\times 10^5, 1\leq w_i\leq 10^9\) 。 题解 首先考虑 \(O(n^2)\) 的 dp , 令 \(dp_{u,i}\) 为 \(u\) 号点 , 取到排名为 \(i\) 权值的概率 . 这个应该比较容易转移 , 考虑枚举一个儿子取的值

LOJ#2537. 「PKUWC2018」Minimax

强颜欢笑 提交于 2020-02-25 05:37:18
Description 小 C 有一棵 n 个结点的有根树,根是 1 号结点,且每个结点最多有两个子结点。 定义结点 x 的权值为: 1.若 x 没有子结点,那么它的权值会在输入里给出,保证这类点中每个结点的权值互不相同。 2.若 x 有子结点,那么它的权值有 px的概率是它的子结点的权值的最大值,有 1?px的概率是它的子结点的权值的最小值。 现在小 C 想知道,假设 1 号结点的权值有 m 种可能性,权值第 i 小的可能性的权值是 Vi,它的概率为 Di,求: Input 输入 第一行一个正整数 n; 第二行 n 个整数,第 i个整数表示第 i 个结点的父亲的编号,其中第 1 个结点的父亲为 0; 第三行 n 个整数,若第 i 个结点没有子结点,则第 i 个数为它的权值,否则第 i 个数为 pi×10000,保证 pi×10000是个正整数。 0<pi<1,1<=N<=3*10^5,1<wi<=10^9 Output 输出答案 Sample Input 3 0 1 1 5000 1 2 Sample Output 748683266 首先我们考虑一个$n^2$的dp 设$f(i,j)$为i这个点取到j这个值的概率(叶子的权值离散化了) $l$为左儿子,$r$为右儿子 当$j$来自$l$时 则$f(i,j)=f(l,j)\left ( \sum_{k=j}^{m}f(r,k)p+

数据结构与算法常见面试题1

烈酒焚心 提交于 2020-02-24 20:22:00
1.八大数据结构及其应用场景(数组、栈、链表、树、图、堆、散列表) 1.数组 数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。连续存储结构其实就是数组。 在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 使用场景 数组在以下三个情形下很有用: 1)数据量较小。 2)数据规模已知。 3)随机访问,修改元素值。 如果插入速度很重要,选择无序数组。如果查找速度很重要,选择有序数组,并使用二分查找。 缺点 1)需要预先知道数据规模 2)插入效率低,因为需要移动大量元素。 2.栈 是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 使用场景 1.十进制与其它进制间的转换 125→1111111 2.行编辑器 #退格 @清除 3.平衡符号的判断 {[()()]} 4.中缀表达式转后缀表达式 顺序栈 优点 1)在输入数据量可预知的情形下,可以使用数组实现栈,并且数组实现的栈效率更高

二叉树结点最小深度求解算法(Java语言描述)

纵饮孤独 提交于 2020-02-24 04:53:21
问题描述 给定二叉树,找到其最小深度。 最小深度是沿着从根结点到最近的叶子结点的最短路径的节点数。 分析 递归 实现即可: 当前结点为null,表示到达了叶子结点,终止递归,返回0。 当前结点非null,表示还没到达叶子结点, 左儿子空,右儿子非空,就深度+1并以当前结点为根结点,递归右子树; 右儿子空,左儿子非空,就深度+1并以当前结点为根结点,递归左子树; 除此之外,左右都非空,就深度+1并返回左右深度的min()值。 编程实现 public class Solution { public int getDepth ( TreeNode root ) { if ( root == null ) { return 0 ; } else if ( root . left == null && root . right != null ) { return getDepth ( root . right ) + 1 ; } else if ( root . left != null && root . right == null ) { return getDepth ( root . left ) + 1 ; } return Math . min ( getDepth ( root . left ) , getDepth ( root . right ) ) + 1 ; } }

左式堆的完整实现(含比较器,Java)描述

我的梦境 提交于 2020-02-24 03:55:30
引言 二叉堆是对优先队列的一种高效实现,左式堆是针对二叉堆合并操作困难的缺点,而提出的另外一种优先队列实现方式。 线性结构合并困难是显而易见的,而二叉堆那样高效的支持合并操作而且只使用一个数组更是难得。 这是因为,合并似乎需要把一个数组拷贝到另一个数组中去,对于相同大小的堆,这将花费O(N)。 但这区区O(N)还不够,所以就不能使用顺序存储结构,应该使用链式指针。有一句话说的特别好: 所有支持高效合并的高级数据结构都需要使用指针 。 能更高效完成合并的 左式堆 和 二项队列 显然都是使用了 指针 ,是 链接存储 的。 左式堆详解 这里有一篇比较详细的讲解,可看 从npl属性看左式堆 注意理解 npl 这个属性, npl 是 null path length 的缩写,意为 从该结点到达一个没有两个孩子的结点的最短距离 (一个孩子的结点或者叶子结点)。 一般定义 null 的 npl 为 -1 以使计算简便。 容易得到,任意结点的 npl 是它的子结点的 npl 中 较小 的那个结点的 npl+1 。 即 root.npl = min(root.left.npl, root.right.npl)+1 (前提是root != null && root.left != null && root.right != null,否则空指针……) 任意结点的左孩子的 npl 大于等于右孩子的

算法导论:Trie字典树

a 夏天 提交于 2020-02-23 15:13:45
1、 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。 Trie一词来自re trie ve,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”。 Trie树可以利用字符串的公共前缀来节约存储空间。如下图所示,该trie树用10个节点保存了6个字符串pool、prize、preview、prepare、produce、progress 在该trie树中,字符串preview,prepare公共前缀是“pre”,因此可以只存储一份“pre”以节省空间。当然,如果系统中存在大量字符串且这些字符串基本没有公共前缀,则相应的trie树将非常消耗内存,这也是trie树的一个缺点。 Trie树的基本性质可以归纳为: (1)根结点不包含字符,除根节点意外每个结点只包含一个字符。 (2)从根结点到某一个结点,路径上经过的字符连接起来,为该结点对应的字符串。 (3)每个结点的所有子结点包含的字符串不相同。 注意:每个结点可以有没有或者一个或者多个字结点,叶子结点没有子结点 2、数据结构表示 /** * 定义字典树的数据结构 * c 当前节点值 * isLeaf 是否是叶子结点 * children 孩子,key是孩子结点值,value是孩子结点的下一个字典树 * */ class

判断是否是完全二叉树

给你一囗甜甜゛ 提交于 2020-02-23 11:10:10
判断一棵树是否是完全二叉树的思路 1>如果树为空,则直接返回错 2>如果树不为空:层序遍历二叉树 2.1>如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列; 2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树; 2.2>如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树; bool check(BiTree T) { if (T == NULL) return false; queue<BiTree> Q; Q.push(T); while (!Q.empty()) { BiTree p = Q.front(); Q.pop(); if (p->left && p->right) { Q.push(p->left); Q.push(p->right); } else if(p->right && p-left == NULL) return false; else { if(p->left && p-right == NULL) Q.push(p->left); while(!Q.empty()) { p = Q.front(); Q.pop(); if(p->left || p->right) return false; } } } return

机器学习——由公式看透算法(1)___决策树

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-23 01:16:41
定义 : 决策树学习方法通常是一个递归地选择最优特征,并根据特征对训练数据进行分割,使得各个子集有一个最优的分类过程。决策树学习的实际问题:确定决策树增长的深度;处理连续值得属性;选择一个适当的属性筛选度量标准;处理属性值不完整的训练数据;处理不同代价的属性;提高计算效率。 内容: 决策树学习是应用很广泛的归纳推理算法,是一种逼近离散值函数的方法,对噪声具有很强的健壮性且能够学习析取表达式。初期的决策树学习从表面理解就是处理一些简单的实例分类,当然决策树本质上就是对训练样例进行分类。其中实例具有明确的属性,这样容易确定节点;实例具有离散的输出值,这样才可以进行分类;具有析取表达式,可以用明确的表达式进行表示。 决策树学习是从顶向下进行学习,基本算法是ID3,在进行构造决策树是关键问题是如何选择根节点,分类能力最好的属性被选择为树的根结点。所以如何确定分类能力就,进行判断是决策树构建的关键点。 公式: (1) (2) (3) 其中决策树的核心公式算法为三个,无论是ID3还是C5.4核心是计算这三个公式。 公式解释: 公式(1) :在决策树中是利用信息增益来决定根结点,用 其中P+表示在S中的正例的比例, P-为反例,举例说明14个样例的集合,其中9个正样例,5个反样例,则S相对于布尔分类的熵为: 在熵计算中可以根据比例大小可以估计熵大小,图形如下图: 公式(2)