树、图、堆、STL

图论基础

简单图:

没有自环,两个顶点之间最多只有一条边。

完全图:

一个简单图,每两个顶点之间都有一条边。一共有(n-1)*n/2条边。

二分图:

一个简单图,设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。

一般二分图都能化成:

图的定义:

相邻、度数…………

有向图:

边都是单向的。

带权图:

可以给边加权,成为带权图。

稀疏图:

边与V*(V-1)相比非常少的图。他的补图为稠密图。

简单路径:

不出现重复的点。

连通图:

每两点之间都有路径。

树:

N个点,N-1条边

关于树的具体知识:

1.纳尼??Vector(顺序表结构 向量)和List(单链表)居然不够用??

vector list
search log n 线性
insert 线性 O(1)

无法同时兼顾高效性!!

2.中间概念

边、节点、指定根、有根树、子树、孩子、父亲、度数、兄弟、祖先、后代、叶子节点。没有意外的话,上文有讲。

任何一棵树中,所含的边数应该恰好等于所有顶点度数之和,也等于顶点总数-1.

3.有序树:将同一节点的所有孩子编号使他们具有这种意义上的某一个次序

4.WTF??原来树这么神奇?? 树:无环连通图 极小连通图 极大无环图

5.树的半线 性 v的祖先/后代若存在,则必然/未必唯一.

6.生成树:原图的子图,是一棵树。

图/树 ( 反正是通用的 ) 的表示方法 : 邻接矩阵与邻接表。

邻接矩阵:

优点:查找/删除一个点时间复杂度O(1)

邻接表:

优点:快速遍历某点所有数据 以及 占用空间小

缺点:查找、删除边不是常数时间。

二叉树

定义:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

由二叉树定义以及图示分析得出二叉树有以下特点:

1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。

2)左子树和右子树是有顺序的,次序不能任意颠倒。

3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。 这点与普通的树不同。

1)在二叉树的第i层上最多有2i-1 个节点 。(i>=1)

2)二叉树中如果深度为k,那么最多有2k-1个节点。(k>=1)

3)n0=n2+1 n0表示度数为0的节点数,n2表示度数为2的节点数。

4)在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]是向下取整。

5)若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点有如下特性:

(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;

(2) 若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;

(3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。

所以,二叉树的表示比普通的树的表示方便多了!! 只需开一个数组,记录当前节点(x)以及节点编号(y)。他爸的编号就是y/2。

STL 数据结构

标准数据库,简称STL;

数据结构:

1.栈(stack)

1.1 栈的定义

栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。所以,我们一般画一个桶来模拟栈的运行。

我们来实现栈:

#include <stack>
stack <int> a;
a.push(x);
a.pop();
a.empty();
a.top();

2.队列(queue)

与栈相反,队列的规则是先进后出。

#include <queue>
queue <int> a;
empty()函数返回真(true)如果队列为空,否则返回假(false)。 front()返回队列第一个元素的引用。 pop()函数删除队列的一个元素 push() 在末尾加入一个元素 size() 返回队列中元素的个数
优先队列

它是个队列,你把数据存进去,C++的STL自动帮帮你排序(你可以这么理解吧)。

#include <queue>
queue <int> a;
empty()函数返回真(true)如果队列为空,否则返回假(false)。 top()返回队列第一个元素的引用。 pop()函数删除队列的一个元素 push() 在末尾加入一个元素 size() 返回队列中元素的个数

操作与上面类似。

本文有部分参考:作者:MrHorse1992链接:https://www.jianshu.com/p/bf73c8d50dc2来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

树、图、堆、STL(来自菜鸡的"炒鸡"干粮)的更多相关文章

  1. 【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra

    题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a, ...

  2. JavaScript 数据结构与算法之美 - 非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?

    1. 前言 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手. 非线性表(树.堆),可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法 ...

  3. 树和堆(julyedu网课整理)

    date: 2018-12-05 16:59:15 updated: 2018-12-05 16:59:15 树和堆(julyedu网课整理) 1 定义 1.1 树的定义 它是由n(n>=1)个 ...

  4. ㊙力荐!!!那些炒鸡有用的chrome插件㊙

    今天咱们来说一说那些炒鸡

  5. 炒鸡简单的canvas粒子(山东数漫江湖)

    位图的canvas一直不会被svg比下去的原因了. 俗话说,须弥芥子,是大小之说,也有以小见大之说,颗颗粒子,足以构建宏大效果. 这是一篇炒鸡简单的canvas粒子教程,主要是讲如何粒子特效的原理,一 ...

  6. 洛谷 P5471 - [NOI2019] 弹跳(二维线段树优化建图+堆优化存边)

    题面传送门 一道非常有意思的题(大概可以这么形容?) 首先看到这类一个点想一个区域内连边的题目可以很自然地想到线段树优化建图,只不过这道题是二维的,因此需要使用二维线段树优化建图,具体来说,我们外层开 ...

  7. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

  8. 【51nod1443】路径和树(堆优化dijkstra乱搞)

    点此看题面 大致题意:给你一个无向联通图,要求你求出这张图中从u开始的权值和最小的最短路径树的权值之和. 什么是最短路径树? 从\(u\)开始到任意点的最短路径与在原图中相比不变. 题解 既然要求最短 ...

  9. 【BZOJ4504&&Hihocoder1046】K个串(主席树,堆)

    题意:一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次)询问第k大的和是多少 1 <= n <= 100000, 1 < ...

随机推荐

  1. intellIJ IDEA学习笔记2

    常用的有fori/sout/psvm+Tab即可生成循环.System.out.main方法等boilerplate样板代码 例如要输入for(User user : users)只需输入user.f ...

  2. DDOS浅谈

    一.DDOS攻击的来源 任何攻击都不会凭空产生,DDOS也有特定的来源.绝大多数的DDOS攻击都来自于僵尸网络.僵尸网络就是由数量庞大的可联网僵尸主机组成,而僵尸主机可以是任何电子设备(不仅是X86架 ...

  3. linux100day(day4)--文本处理三剑客

    在介绍三剑客之前,先来认识一下通配符和正则表达式 通配符 正则表达式 作用:通过一些特殊字符,来表示一类字符内容 1.字符匹配 .     任意一个字符 [ ]   范围内的任意一个字符 [^ ] 取 ...

  4. Oracle delete和truncate实践操作之一

    实践说明 本文章主要记录在Oracle中,delete和truncate进行数据删除之后,如何进行数据恢复.由于网上对delete和truncate的区别说明较多,此处不过多介绍两者区别. 注:由于环 ...

  5. Appium+python自动化(三十三)- 环境(超详解)

    简介 在前边所有涉及启动app的时候有这样一行代码driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps),很多小 ...

  6. 章节十六、2-TestNG注解和断言

    一.TestNG注解的testcease不是自上而下运行的,而是按照方法名的字母排序或数字的大小顺序运行的. 二.断言:判断返回的结果与我们的预期结果是否一致. 1.Assert.assertTrue ...

  7. Python 命令行之旅 —— 深入 argparse (一)

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  8. HTTP2.0的多路复用和HTTP1.X中的长连接复用区别

    HTTP/2 多路复用 (Multiplexing)    多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息 HTTP1.1 在HTTP/1.1协议中,浏览器客户端在同一时间,针 ...

  9. Mac查看及清理QQ、微信之前下载的图片、视频或DB等

    之前写过一篇清理Mac空间的文章: Mac系统清理.占用空间大.空间不够.查看系统文件大小分布 其实这篇文章不是太全,有些资源还是清理不彻底,正好前段时间需要找微信下载的资源,其实可以算作空间清理的续 ...

  10. Oracle cursor学习笔记

    目录 一.oracle库缓存 1.1.库缓存简介 1.2.相关概念 1.3.库缓存结构 1.4.sql执行过程简介 二.oracle cursor 2.1.cursor分类 2.2.shared cu ...