| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 堆和并查集 -> 正文阅读 |
|
[数据结构与算法]堆和并查集 |
堆(STL中的优先队列)优先队列:在队列中,元素被赋予优先级,优先级最高的最先被弹出
学习堆在学习堆之前,我们要知道什么叫完全二叉树 二叉树:指树种的节点的度不大于2的有序树
? 完全二叉树:深度为k,有n个结点的二叉树,当且仅当每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树,如图所示 通俗来讲,除了最深层,其他所有层数的结点都是满的,最深层的结点从左到右,编号递增排列 ? ? 实现完全二叉树 用数组实现 注意下标从1开始
模拟堆构建一个小根堆
插入
删除
给出一道题 可以自行联系模拟堆的部分操作 在实际做题中,很少使用手写堆,而是使用STL中的priority_queue ---------------------------------------------------------------------------------- 并查集现在有一个问题:给出n个点和m条边的无向图,询问任意两点是否连通 我们能想到的比较朴素的算法就是dfs搜索 看一下能不能搜到,时间复杂度是o(n) 引入并查集 并查集可以在将近o(1)的情况下来查询两个点是否处于一个集合中 应用
我们可以这样想象 一开始有n个人,这n个人一开始只有一个老大,就是自己 ? 在争夺地盘的时候,逐渐形成了帮派 有的人开始认老大,有的人收小弟 ?有的老大在抢地盘的时候败北,带着自己的小弟全部投靠了那位老大 ? 这里需要非常注意的是:
简述一下代码思路 利用树来存储每一个集合,用树根(老大)的编号来代表整个集合的编号。每个节点存储他的父节点,例如p[x]就是x的父节点。 问题1:如何判断树根? 答;自己的老大是自己的人,就是树根,也就是根节点
问题2:如何求x的集合编号? 答:通俗的说,从x一路向上直到树根。
问题三:如何查询x和y是否在一个集合里? 答:fa[x] == fa[y] 代表x和y在同一个集合 问题四:如何合并两个集合? 答:加一条边(一个集合的根节点的父节点为另一个集合的根节点)
我们讨论一种极端情况 在上面的问题2中,出现了这样的情况
根据上述情况,我们提出了名叫路径压缩的方法 在每次查询的时候,把路径上的点的父亲改成根节点,以便于以后再查询 模板如下
并查集裸题 这里有并查集的基本使用方法 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 19:31:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |