叶子结点

Python 堆与堆排序

我是研究僧i 提交于 2020-01-10 07:02:09
堆排序 与 快速排序 , 归并排序 一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树。 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。 当父结点的键值总是大于或等于任何一个子节点的键值时为 最大堆 。当父结点的键值总是小于或等于任何一个子节点的键值时为 最小堆 。下图展示一个最小堆: 由于其它几种堆(二项式堆,斐波纳契堆等)用的较少,一般将二叉堆就简称为堆。 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。 堆的操作——插入删除 下面先给出《 数据结构 C++语言描述》中最小堆的建立插入删除的图解,再给出本人的实现代码,最好是先看明白图后再去看代码。 堆的插入 每次插入都是将新数据放在数组最后。可以发现从这个新数据的父结点到根结点必然为一个有序的数列,现在的任务是将这个新数据插入到这个有序数据中——这就类似于 直接插入排序 中将一个数据并入到有序区间中,对照 《白话经典算法系列之二 直接插入排序的三种实现》

堆和堆排序

大憨熊 提交于 2020-01-10 07:01:26
堆排序 与 快速排序 , 归并排序 一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树。 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。 当父结点的键值总是大于或等于任何一个子节点的键值时为 最大堆 。当父结点的键值总是小于或等于任何一个子节点的键值时为 最小堆 。下图展示一个最小堆: 由于其它几种堆(二项式堆,斐波纳契堆等)用的较少,一般将二叉堆就简称为堆。 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。 堆的操作——插入删除 下面先给出《数据结构C++语言描述》中最小堆的建立插入删除的图解,再给出本人的实现代码,最好是先看明白图后再去看代码。 堆的插入 每次插入都是将新数据放在数组最后。可以发现从这个新数据的父结点到根结点必然为一个有序的数列,现在的任务是将这个新数据插入到这个有序数据中——这就类似于 直接插入排序 中将一个数据并入到有序区间中,对照 《白话经典算法系列之二 直接插入排序的三种实现》

B树,B+树

为君一笑 提交于 2020-01-10 04:34:39
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化 大块数据的读和写操作 。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在 数据库 和 文件系统 。” 定义 B 树 可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。 根节点至少有两个子节点 每个节点有M-1个key,并且以升序排列 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间 其它节点至少有M/2个子节点 下图是一个M=4 阶的B树: 可以看到B树是2-3树的一种扩展,他允许一个节点有多于2个的元素。 B树的插入及平衡化操作和2-3树很相似,这里就不介绍了。下面是往B树中依次插入 6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4 的演示动画: B+ 树是对B树的一种变形树,它与B树的差异在于: 有k个子结点的结点必然有k个关键码; 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。

红黑树学习笔记

限于喜欢 提交于 2020-01-09 02:47:40
红黑树学习笔记 红黑树是一种二叉查找树,接近平衡的,确保没有一条路径比其他路径长2倍。 性质: 1)每个结点要么是红的,要么是黑的。 2)根结点是黑的。 3)每个叶子结点,即空结点是黑的,叶子是NIL结点 4)如果一个结点是红的,那么他的两个孩子是黑的 5)对每个结点,从该结点到其子孙结点的所有路径包含相同数目的的黑结点 性质4暗示着任何一个简单路径上不能有两个毗连的红色节点,这样,最短的可能路径全是黑色节点,最长的可能路径有交替的红色和黑色节点。同时根据性质5知道:所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。 插入操作: 1)查找要插入的位置,O(n),其操作跟二叉查找树一样。 2)将新结点的color设置为red 3)自下而上调整树为红黑树 插入情况: 1)新的结点N位于树的根上,没有父节点: node n; n->color = red; void inster_case1(node n) { if(n->parent == NULL) n->color = black; else insert_case2(n); } 2)父亲结点为黑色P: void inster_case2(node n) { if(n->parent->color == black) return ; else inster_case3(n); } 3)父节点P

数据结构基础温故-4.树与二叉树(上)

孤者浪人 提交于 2020-01-09 00:33:45
前面所讨论的线性表元素之间都是一对一的关系,今天我们所看到的结构各元素之间却是一对多的关系。树在计算机中有着广泛的应用,甚至在计算机的日常使用中,也可以看到树形结构的身影,如下图所示的Windows资源管理器和应用程序的菜单都属于树形结构。树形结构是一种典型的 非线性 结构,除了用于表示相邻关系外,还可以表示层次关系。本文重点讨论树与二叉树的基本结构和遍历算法等内容。 一、好大一棵树,绿色的祝福 1.1 树的基本概念 Defination: 树(Tree)是 n(n≥0)个结点的有限集。n=0时,该树被称为“空树”。如上图所示,A点称为根节点,它有两棵子树,分别以B、C为根,而以C为根的子树又可以分成两棵子树。   1.2 树的基本术语   (1)不同的节点:根节点、内部节点、叶子节点以及节点的 度    (2)节点的关系:双亲与孩子,爸爸回来了,爸爸去哪儿?   (3)节点的层次:结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。树中结点的最大层次称为树的 深度 (Depth)或 高度 。 二、二叉树又是个什么鬼 2.1 从猜数字游戏引出二叉树   回忆一下,当年某电视节目中会让游戏参与者猜一个产品的价格,如果参与者在限定时间内猜对了,那么他就可以获得这个产品。很多人都是一点点的提高数值来猜,但是这样猜会很没有效率。因此

[数据结构]-11树

我们两清 提交于 2020-01-08 20:41:47
文章目录 树 树与线性结构的比较 树 什么是树? 具有 n ( n ≥ 0 ) n(n\ge 0) n ( n ≥ 0 ) 个结点的有限集称为 树 。 当 n = 0 n = 0 n = 0 时称为 空树 ; 当 n ≥ 1 n\ge 1 n ≥ 1 时, 仅有一个特定的称为 根 的结点 其余结点可分为 m ( m ≥ 0 ) m(m\ge 0) m ( m ≥ 0 ) 个互不相交的有限集 每一个集合本身又是一棵树,称为根的 子树 树的特点 树是非线性结构,数据元素具有"一对多"的逻辑关系 树中的每个元素最多有一个前驱结点,有多个后继结点 树的结点 树的每一个数据元素称为 结点 ,如上图中的 A , B , C , . . . , M A,B,C,...,M A , B , C , . . . , M 都是结点。 非空树中无前驱结点的结点称为 根结点 ,如上图中的 A A A 为树的根结点。 根结点以外的分支结点称为 内部结点 。 结点的子树的根称为该结点的 孩子结点 ,该结点称为孩子结点的 父结点 。 同一个父结点的孩子结点之间称为 兄弟结点 。 从根到某个结点的所经过的分支上的所有结点称为 结点的祖先 。 而以某结点为根的子树中的任一结点称为该结点的 子孙 。 没有任何孩子结点的结点称为 叶子结点 。 双亲在同一层的结点互为 堂兄 。 什么是结点的度和层次?

Kdtree(K-dimension tree)学习

你。 提交于 2020-01-08 10:47:41
以下总结纯属个人学习理解,如有不对还望留言改正。参考文章博客地址如下: https://blog.csdn.net/likika2012/article/details/39619687 https://blog.csdn.net/zhjchengfeng5/article/details/7855241 https://www.joinquant.com/view/community/detail/c2c41c79657cebf8cd871b44ce4f5d97 https://zhuanlan.zhihu.com/p/22557068 https://www.cnblogs.com/dirge/p/6091241.html https://leileiluoluo.com/posts/kdtree-algorithm-and-implementation.html 感谢几位大神的详细总结; 首先要学习kdtree就要先理解二叉树,因为实现kdtree的数据结构是基于二叉树思想来实现的。 二叉树顾名思义就是一个根节点有两个子节点;二叉树思想: 二叉查找树(Binary Search Tree,BST),是具有如下性质的二叉树(来自wiki): 1)若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; 2)若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;

B+树与B*树小结

只愿长相守 提交于 2020-01-08 09:31:45
一、B+树 1.B+树定义与特性 B+ 树是 B- 树的变体,也是一种多路搜索树: 其定义基本与 B- 树同,除了: 1). 非叶子结点的 子树指针与关键字个数相同 ; 2). 非叶子结点的 子树指针 P[i ] ,指向关键字值属于 [K[i], K[i+1]) 的子树 ( B- 树是开区间); 3). 为所有叶子结点 增加一个链指针 ; 4). 所有关键字都在叶子结点出现 为了全面 这里给出网上另外一种说法: 一棵m阶的B+树和m阶的B树的差异在于: 1.有n棵子树的结点中含有n个关键字; (而B 树是n棵子树有n-1个关键字) 2. 所有的叶子结点中包含了全部关键字的信 息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息) 3. 所有的非终端结点可以看成是索引部分 ,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息) 下图给出典型的3阶B+树示例 B+ 的特性: 1). 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好 是有序的; 2). 不可能在非叶子结点命中; 3). 非叶子结点相当于是叶子结点的索引 (稀疏索引),叶子结点相当于是存储 (关键字)数据的数据层; 4). 更适合文件索引系统; 2.B+树的基本操作 1)查找操作

【数据结构】严蔚敏笔记整理

左心房为你撑大大i 提交于 2020-01-07 15:58:37
时隔多日的复更。 本鶸备考过程中整理了一下 部分 的数据结构的笔记以及严奶奶书上的代码。 不算全面,笔记有错的地方还请指出嗷QWQ。 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 5 /*基本操作 6 InitList(&L); //构造一个空的线性表 7 DeStroyList(&L); //销毁一个线性表 8 ClearList(&L); //置空表 9 ListEmpty(L); //判断空表 10 ListLength(L); //返回L中数据元素的个数 11 GetELem(L,i,&e); //返回L中第i个数据元素的值 12 LocateElem(L,e,compare()); //和e满足位序 13 PriorElem(L,cur_e,&pre_e); //返回前驱 14 NextElem(L,cur_e,&pre_e); //返回后继 15 ListInsert(&L,i,e); //在第i个前插入元素e 16 ListDelete(&L,i,&e); //删除L的第i个数据元素 17 ListTraverse(L,visit()); //没个数据元素访问一次 18 19 */ 20 21 //线性表 22 #define LIST_INIT_SIZE 100 23 #define

排序算法汇总

删除回忆录丶 提交于 2020-01-03 05:02:57
1.排序算法简要比较 名称 数据对象 稳定性 时间复杂度 空间复杂度 描述 平均 最坏 插入排序 数组、链表 √ O(1) (有序区,无序区)。把无序区的第一个元素插入到有序区的合适的位置。对数组:比较得少,换得多。 直接选择排序 数组 × O(1) (有序区,无序区)。在无序区里找一个最小的元素跟在有序区的后面。 对数组:比较得多,换得少。 链表 √ 堆排序 数组 × O(nlogn) O(1) (最大堆,有序区)。从堆顶把根卸出来放在有序区之前,再恢复堆。 归并排序 数组、链表 √ O(nlogn) O(n) +O(logn) , 如果不是从下到上 把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行。 快速排序 数组 × O(nlogn) O(logn) ,O(n) (小数,枢纽元,大数)。 Accum qsort 链表 √ O(nlogn) O(logn) ,O(n) (无序区,有序区)。把无序区分为(小数,枢纽元,大数),从后到前压入有序区。 决策树排序 √ O(logn!) O(n!) O(n) <O(logn!) <O(nlogn) 计数排序 数组、链表 √ O(n) O(n+m) 统计小于等于该元素值的元素的个数 i,于是该元素就放在目标数组的索引 i位。(i≥0) 桶排序 数组、链表 √ O(n) O(m) 将值为 i 的元素放入i