叶子结点

“回溯”算法总结(深度优先遍历 + 状态重置 + 剪枝)

自作多情 提交于 2020-01-15 03:54:03
地址:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/ 首先解释“回溯”算法的应用,“回溯”算法主要用于搜索,因此有时候“回溯算法”也叫“回溯搜索”。这里“搜索”的意思即“查找我们所需要的解”。我们每天使用的“搜索引擎”就是帮助我们在庞大的互联网上搜索我们需要的信息。 而这里的“回溯”指的是“状态重置”,可以理解为“回到过去”、“恢复现场”,是在编码的过程中,为了节约空间而使用的一种技巧。 下面我们通过一个非常经典的问题,介绍“回溯”算法在查找问题的解中的应用。 这是「力扣」上第 46 号问题:“全排列”,这道题给我们一个没有重复数字的数组,要求我们返回其所有可能的全排列。 例如给出的数组是 [1, 2, 3] ,这个数组所有可能的全排列如下: [ [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1] ] 我们知道, N 个数字的全排列一共有 N ! N! N ! 这么多个。 大家可以尝试一下在纸上写 3 个数字、4 个数字、5 个数字的全排列,相信不难找到这样的方法。 例如数组 [1, 2, 3] 的全排列。 我们先写以 1 开头的全排列

堆排序之Python实现

巧了我就是萌 提交于 2020-01-14 16:06:20
目录 python算法之堆排序 堆的概念: 堆的类型 堆排序步骤 构建完全二叉树 构建大顶堆 排序 总结 代码实现 python算法之堆排序 注意:本文中的结点和结点不加区分的使用 堆的概念: 堆是一个完全二叉树 每个非叶子结点都要大于或者等于其左右孩子结点的值称为大顶堆 每个非叶子结点都要小于或者等于其左右孩子结点的值称为小顶堆 根结点一定是大顶堆中的最大值,一定是小顶堆中的最小值 堆其实是从节点值来观察,结点值具有一点特点的完全二叉树 堆的类型 根据堆的特性,我们可以把堆分为两类 大顶堆 完全二叉树的每个非叶子结点都大于或者等于其左右孩子结点的值,根结点一定是大顶堆中的最大值, 如图1 小顶堆 每个非叶子结点都要小于或者等于其左右孩子结点的值,根结点一定是大顶堆中的最小值, 如图2 堆排序步骤 构建完全二叉树 原始数据:30,20,80,40,50,10,60,70,90 构建一个完全二叉树存放数据,并根据完全二叉树的性质5对元素编号,: 放入顺序的数据结构中构造一个列表为[0,30,20,80,40,50,10,60,70,90](插入一个0,是为了将数组的下标和完全二叉树的结点编号一致),如下图 构建大顶堆 怎么将一个队列构建成大顶堆(或者小顶堆),是堆排序的 算法核心部分 分析 1.度数为2的结点A,如果他的左右孩子结点的最大值比它大的,最大值和该结点交换 2

20162327 《程序设计与数据结构》第九周学习总结

半世苍凉 提交于 2020-01-14 05:42:23
20162327 2017-2018-1 《程序设计与数据结构》第九周学习总结 教材学习内容总结 1、堆是一棵完全二叉树,其中每个元素大于等于其所有的子结点的值 2、向堆中添加一个元素的方法是,首先将这个元素添加为叶节点,然后将其向上移动到合适的位置 3、从堆中删除最大元素的方法是,利用最后的叶节点来取代根,然后将其向下移动到合适的位置 4、堆排序利用堆得基本特性堆一组元素进行排序 5、优先队列不是FIFO队列。它根据优先级排列元素,而不是根据他们进入队列的次序来排列 教材学习中的问题和解决过程 问题1:对于堆的概念的理解 问题1解决方案: 堆是一棵完全二叉树,二叉排序树不一定是完全二叉树; 在二叉排序树中,某结点的右孩子结点的值一定大于该结点的左孩子结点的值,在堆中却不一定; 在二叉排序树中,最小值结点是最左下结点,最大值结点是最右下结点。在堆中却不一定。 问题2:对于哈夫曼树的理解 问题2解决方案: ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径。 ② 路径长度:结点路径上的分支数目称为路径长度。 ③ 树的路径长度:从树根到每一个结点的路径长度之和。 例图6-23的树。A到F :结点路径AEF;路径长度(即边的数目) 2;树的路径长度:3´1+5´2+2´3=19 ④结点的带权路径长度:从该结点的到树的根结点之间的路径长度与结点的权(值)的乘积。

二叉树,完美二叉树,满二叉树,完全二叉树

孤人 提交于 2020-01-13 14:15:41
二叉树 在计算机科学中,二叉树是每个结点 最多 有两个子树的树结构 下面这个就不是二叉树, B节点 下面右3个子节点 满二叉树与完美二叉树 国内的翻译和国外是有些对不上的\ 完美二叉树 英文: Perfect Binary Tree, 有时候在国内就叫 满二叉树 除了叶子结点之外的每一个结点都有两个孩子,每一层(当然包含最后一层)都被完全填充 满二叉树 英文: Full Binary Tree 除了叶子结点之外的每一个结点都有两个孩子结点( 只要你有孩子,你就必然是有两个孩子 ) 国内早期教材中,满二叉树一般指 perfect binary tree,所以会有满二叉树是完全二叉树的一个特例的说法 完全二叉树 除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐 完全二叉树的向左对齐 有点令人困惑, 英文的描述为: Every level except the last level is completely filled and all the nodes are left justified. 第 h 层所有的结点都连续集中在最左边,这就是完全二叉树 如果将编号11(K)结点从编号6(E)的左儿子位置移动到编号5(E)的右儿子位置,则变成一棵完全(Complete)二叉树。 结论就是: 向左对齐,就是要全部靠左边且连续,上图就是很好的反例

B-树和B+树和B*树和R树

妖精的绣舞 提交于 2020-01-12 16:49:28
  在大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于 树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下 ,那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用 多叉树 结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。   为了更有效的 减少树的深度 ,新的查找树结构——多路查找树。根据平衡二叉树的启发,自然就想到平衡多路查找树结构。即B树结构。    磁盘读取数据是以盘块 (block) 为基本单位的。 位于同一盘块中的所有数据都能被一次性全部读取出来。而磁盘IO代价主要花费在查找时间Ts上。因此我们应该尽量将相关信息存放在同一盘块,同一磁道中。或者至少放在同一柱面或相邻柱面上,以求在读/ 写信息时尽量 减少磁头来回移动的次数 ,避免过多的查找时间 Ts 。   所以,在大规模数据存储方面,大量数据存储在外存磁盘中,而在外存磁盘中读取/写入块(block)中某数据时,首先需要 定位到磁盘中的某块 。 1.B-树(B树)   1)定义   B是 balanced,而不是b inary,B-树或B_树 不要误解成“B减树”,“-”“_”只是连字符。   是一种多路搜索树(并不是二叉的),一个M阶的B树: 1

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

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

浅谈分支限界算法

对着背影说爱祢 提交于 2020-01-12 04:42:13
1. 定义: 分支限界算法是按照广度优先的方式对解空间树(状态空间树)进行搜索,从而求得最优解的算法。在搜索的过程中,采用 限界函数 (bound function)估算所有子节点的目标函数的可能取值,从而选择使目标函数取极值(极大值或者极小值)的节点作为扩展结点(如果限界值没有超过目前的最优解,则剪枝)进行下一步搜索(重复 BFS -> 计算所有子节点限界 -> 选择最优子节点作为扩展结点 的过程),从而不断调整搜索的方向,尽快找到问题的最优解。 ( ps:回溯算法求出满足约束的所有可行解,分支限界求出满足约束的解中使得目标函数达到极值的最优解 ) 分支限界的思想类似于:图的广度优先搜索,树的层序遍历。 2. 分支限界算法和回溯算法的不同点: (1)分支限界算法与回溯算法在 子结点的扩展方式 上不同: 回溯一般采用轮流遍历子节点的方式扩展结点。 分支限界则采用活结点的方式,一次性对所有的可行子节点进行扩展,估算子节点目标函数的可能值,如果该子节点的目标函数值差于当前最优解,则丢弃;否则将其加入活叶子表,依次从表中选取使目标函数取极值的节点作为当前的扩展结点。重复这一过程,直到找到最优解。 (2)分支限界算法与回溯算法在 解空间树的搜索方式 上不同: 回溯采用 深度优先搜索 的方式去搜索解空间树。搜索过程中,对所有的子节点轮流进行深度优先搜索,一旦发现有不满足约束的子节点

【DS】第四章-二叉树

╄→尐↘猪︶ㄣ 提交于 2020-01-11 00:40:41
树的概念及结构 什么是树   树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多 个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结 点可以分为多个不相交的子树。   下图就是一棵常见的树。 树的常用名词   节点的度:一个节点含有的子树的个数称为该节点的度;   叶节点或终端节点:度为0的节点称为叶节点;   非终端节点或分支节点:度不为0的节点;   如上图:D、E、F、G…等节点为分支节点 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;   孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;   兄弟节点:具有相同父节点的节点互称为兄弟节点;   树的度:一棵树中,最大的节点的度称为树的度;   节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;   树的高度或深度:树中节点的最大层次;   堂兄弟节点:双亲在同一层的节点互为堂兄弟;   节点的祖先:从根到该节点所经分支上的所有节点;   子孙:以某节点为根的子树中任一节点都称为该节点的子孙;   森林:由m(m>=0)棵互不相交的树的集合称为森林; 树的表示  

MySQL的InnoDB索引原理详解

自闭症网瘾萝莉.ら 提交于 2020-01-10 16:19:36
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 摘要 本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节。 InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM, 文档 )。本着高效学习的目的,本篇以介绍InnoDB为主,少量涉及MyISAM作为对比。 这篇文章是我在学习过程中总结完成的,内容主要来自书本和博客(参考文献会给出),过程中加入了一些自己的理解,描述不准确的地方烦请指出。 1 各种树形结构 本来不打算从二叉搜索树开始,因为网上已经有太多相关文章,但是考虑到清晰的图示对理解问题有很大帮助,也为了保证文章完整性,最后还是加上了这部分。 先看看几种树形结构: 1 搜索二叉树:每个节点有两个子节点,数据量的增大必然导致高度的快速增加,显然这个不适合作为大量数据存储的基础结构。 2 B树:一棵m阶B树是一棵平衡的m路搜索树。最重要的性质是每个非根节点所包含的关键字个数 j 满足:┌m/2┐ – 1 <= j <= m – 1;一个节点的子节点数量会比关键字个数多1,这样关键字就变成了子节点的分割标志。一般会在图示中把关键字画到子节点中间,非常形象,也容易和后面的 B+树区分。由于数据同时存在于叶子节点和非叶子结点中,无法简单完成按顺序遍历B树中的关键字,必须用中序遍历的方法。 3 B+树

红黑树(一)之 原理和算法详细介绍

隐身守侯 提交于 2020-01-10 08:16:08
概要 前面分别介绍红黑树的 理论知识 、红黑树的 C语言 和 C++的实现 。本章介绍红黑树的Java实现,若读者对红黑树的理论知识不熟悉,建立先学习 红黑树的理论知识 ,再来学习本章。还是那句老话,红黑树的C/C++/Java实现,原理一样,择其一了解即可。 目录 1. 红黑树的介绍 2. 红黑树的Java实现(代码说明) 3. 红黑树的Java实现(完整源码) 4. 红黑树的Java测试程序 转载请注明出处: 更多内容: 数据结构与算法系列 目录 (01) 红黑树(一)之 原理和算法详细介绍 (02) 红黑树(二)之 C语言的实现 (03) 红黑树(三)之 Linux内核中红黑树的经典实现 (04) 红黑树(四)之 C++的实现 (05) 红黑树(五)之 Java的实现 (06) 红黑树(六)之 参考资料 红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。 除了具备该特性之外,红黑树还包括许多额外的信息。 红黑树的每个节点上都有存储位表示节点的颜色,颜色是红(Red)或黑(Black)。 红黑树的特性: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。