![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
cominglately
时间过得好快 ...
勉力前行
展开
-
红黑树
文章目录简单介绍基本概念删除重平衡原理代码实现简单介绍avl树删除操作最坏情况需要O(logn)旋转;为了解决这一问题,需要将平衡的定义的更加宽泛些,这就是红黑树了(删除和新增只需要O(logn)时间)适度平衡没有平衡因子的概念,但是要求任一节点的左右子树高度不得相差2倍红黑条件树根均是黑色外部节点均是黑色其余节点如果是红色,则其孩子节点必需是黑色从任一外部节点到根节点...原创 2020-04-19 20:04:03 · 211 阅读 · 0 评论 -
伸展树
文章目录基本概念介绍基本概念介绍伸展树也是平衡二叉搜索树的一种性事件。相对于AVL它不需要保持树的平衡,但是可以保持高效率。另外不需要记录平衡因子,高度,适用范围更广数据的局部性, 伸展树将访问过的节点伸展至根可以有效利用实际数据访问概率不均衡的特点,提升效率刚刚被访问到的节点,极有可能在不久之后再次被访问到将被访问的下一节点, 极有可能就处在刚刚被访问过的某个节点附近简易...原创 2020-04-04 15:12:26 · 224 阅读 · 0 评论 -
平衡二叉搜索树的实现
文章目录概念介绍代码实现概念介绍AVL树可以将高度控制在o(logn)以内平衡因子左孩子树高 - 右孩子树高AVL就是平衡因子受限的搜索树,其中各个节点的平衡因子的绝对值不超过1等价二叉搜索树两个二叉搜索树的中序遍历序列相同,则称它们等价;这个平衡算法的依据重新平衡的方法AVL的insert,remove导致的失衡通过单旋和双旋的方式实现重新平衡统一平衡算法...原创 2020-04-03 17:02:28 · 302 阅读 · 0 评论 -
二叉搜索树
文章目录介绍实现介绍满足下面两个特性的二叉树就是二叉搜索树顺序性任一节点r的左子树中,所有节点均不大于r , 右子树所有节点均不小于r中旬遍历序列中序遍历序列单调非降实现// 引入二叉树#include "BinTree.h"//定义二叉搜索树模板类template<typename T>class BST : public BinTr...原创 2020-03-31 18:20:35 · 193 阅读 · 0 评论 -
最短路径算法
文章目录场景性质和最小支撑树的区别代码实现场景给定带权网络G,远点s 对于所有的其他顶点v, s到v的最短通路是多少?该通路由哪些边构成性质单调性最短路径树上的任一顶点v到必定是源点s到v的最短路径歧义性最短路径可能不唯一无环性和最小支撑树的区别最小支撑树求的是整个拓扑图的所有路径之和最小,不能保证任意两点之间的路径最小 应用场景: 快递车将霍送到城市的每...原创 2020-03-29 13:31:37 · 294 阅读 · 0 评论 -
最小支撑树(Prim)算法
文章目录算法介绍代码实现算法介绍学习记录支撑树覆盖原图的无环联通子图称作原图的一颗支撑树(生成树)最小支撑树成本最低的支撑树,而成本是各边权重的总和割顶点集V的任一非平凡子集和它的补集都构成一个割。桥如果边uv满足顶点u在子集,v在补集 则称边uv是割的跨越边,也叫做桥。prim算法算法原理最小支撑树总是采用连接每一割的最短桥算法实现(...原创 2020-03-29 00:10:43 · 2478 阅读 · 0 评论 -
优先级算法
文章目录介绍实现源码介绍学习记录给所有顶点赋予不同的优先级数, 随着算法的推进不断调整, 每一步迭代选取的顶点都是当时优先级数最低的那个。负责调整优先级的部分以函数对象形式实现实现源码 // 优先级搜索算法 template <typename PU> void pfs(int v, PU prioUpdater){ // 重置图状态 ...原创 2020-03-23 00:22:35 · 2365 阅读 · 0 评论 -
双连通域分解算法
文章目录算法介绍算法实现算法源码算法介绍学习记录关节点图G删除顶点v后包含的连通域增多,则称v是关节点双连通图不包含关节点的图,任何一个无向图都可以视作由若干个极大的双连通子图组成算法实现可以利用深度优先算法实现,在DFS搜索过程中记录和更新u所能联通的最高祖先(经后向边), hca(u) < dTime(v) 则说明u可以联通v的真祖先,v不是关节点;否则...原创 2020-03-22 10:02:17 · 847 阅读 · 0 评论 -
拓扑排序
文章目录拓扑排序介绍实现思路算法实现拓扑排序介绍学习记录定义: 一个线性序列,该序列中的顶点都不可以通过边指向该序列中的前驱顶点; 该序列成为原图的一个拓扑排序PS:有向无环图才可以实现拓扑排序实现思路该序列的最后一个顶点的出度一定是0,去掉该顶点后,新的末尾顶点的出度也是0 .. .;而此过程对应着深度优先算法, 只需要要将顶点按照访问结束的次序反过来; 这部分操作可以通过栈完...原创 2020-03-21 17:29:17 · 149 阅读 · 1 评论 -
深度优先算法
文章目录介绍实现介绍学习记录优先选取最后一个被访问到的顶点的邻居, 而访问完毕顺序类似于后序遍历首先访问顶点s,才从未访问的领军中任选其一, 然后递归执行上述步骤, 知道没有被访问顶点没有邻接顶点, 此时这个顶点才算访问完毕类似于树的后序遍历算法实现 // 深度优先算法 void dfs(int s) { // 初始化 rese...原创 2020-03-15 21:20:52 · 320 阅读 · 0 评论 -
广度优先算法
文章目录基本信息实现基本信息越早被访问到的顶点,其邻居越优先被选用先访问顶点s,再依此访问未被访问到的邻居,再按照后者被访问的先后循序一次访问它们的邻居和树的层次遍历相似实现 // 广度优先算法 void bfs(int s) { // 重置图关系 reset(); // 时间标签 int cl...原创 2020-03-15 17:51:02 · 226 阅读 · 0 评论 -
邻接矩阵实现
文章目录介绍实现介绍学习记录定义使用方阵A[n][n]表示n个顶点之间构成的图,其中每个单元负责对一对顶点之间邻接关系进行描述缺点方阵可以描述所有可能存在的边的关系, 但是实际问题边并没有出现那么多,浪费了大量的空间; 可以使用A[n] = LIST代替(邻接列表),列表中只存放当前节点一定存在的邻接顶点实现//// Created by carso on 202...原创 2020-03-15 17:15:46 · 455 阅读 · 0 评论 -
位图结构
文章目录简介实现原理位运算的实现实现简介位图结构实现是参考[邓俊辉]数据结构习题解析第三版位图是一种特殊的序列结构,可以动态表示一组无符号整数构成的集合。其长度无限,且其中每个元素的取值都是布尔值(初始false)bool test(int k) 整数k是否存在void set(int k) 整数k放入集合void clear(int k) 删除整数k本文用来记录...原创 2020-02-29 14:37:47 · 381 阅读 · 0 评论 -
试探回溯法解决八皇后的问题
文章目录算法描述八皇后的问题算法实现可执行脚本算法描述试探回溯算法试探从零开始,尝试逐步增加候选解的长度(本质上是成批的考察具有特定前缀的所有候选解),这种从长度上逐渐向目标解靠近的尝试叫做试探回溯一般问题候选解都是呈树状分布的,某个节点不合法,则舍弃这个分支,然后回溯到上上个节点,探索其他的可能八皇后的问题算法实现依赖栈实现// 定义女皇结构str...原创 2020-02-16 22:34:33 · 514 阅读 · 0 评论 -
列表 选择排序算法
文章目录算法介绍算法实现可运行代码算法介绍选择排序算法适用于序列(列表和向量), 维护无序前缀和有序后继,每次都从无序前缀中选取最大值,插入有序后继算法实现// 从启始于p元素的n个节点中选取最大节点 (rank(p), n+ rank(p)) 不包含template <typename T> ListNodePosi(T) List<T>::selectM...原创 2020-02-04 00:12:48 · 392 阅读 · 0 评论 -
列表的插入排序算法
文章目录场景列表插入排序算法实现完整代码场景插入排序算法的描述适用于序列 (列表/向量)实现将序列分成前后两个序列, 前缀序列是有序的, 后继序列是无序的,每次循环都将后继序列的首个节点插入到前缀序列的合适位置列表插入排序算法实现// 插入排序: 对于起始于节点p的n个节点进行排序(包含N) 将序列分成有序的前缀和无序的后缀, 反复的将无序后缀的首元素插入到前缀...原创 2020-01-31 20:07:08 · 734 阅读 · 0 评论 -
有序向量去重算法
文章目录场景算法实现运行实例场景有序向量去重,理论上的最优解是O(n)算法实现算法复杂度 O(n) ,// 有序向量的唯一算法, 返回删除的元素个数int sortVectorUnique(vector<RANGE> &ages) { int old_size = ages.size(); int left_index = 0, right_...原创 2020-01-16 18:17:40 · 373 阅读 · 0 评论 -
归并排序算法
文章目录归并排序算法算法实现调用案列归并排序算法算法实现两个有序的向量或者列表, 每次只比较两个有序序列中首个元素,取小值附加到空序列上, 一旦一个序列空了,另外一个序列的元素可以直接附加到空序列上和冒泡排序相比的优势冒泡排序的复杂度是 O(n^2), 最好情况下是 O(n) 最坏的情况 O(n^2) 不稳定; 而归并排序算法一直是 O(nlogn)算法实现tem...原创 2020-01-15 09:53:44 · 114 阅读 · 0 评论 -
冒泡排序也可以写出一些花样
场景冒泡排序是简单的算法, 但是还是有些花样的原理: 单趟扫描交换使最后一个元素永远是最大的, 扫描知到不需要发生交换花样: 单趟扫描算法返回true表示剩下元素都是排过序的, 不需要继续循环算法主体// 单趟扫描交换算法主体算法template<typename T>bool bubble(T &numbers, RANK low, RANK high...原创 2020-01-12 21:05:47 · 225 阅读 · 0 评论 -
有序向量去重算法
文章目录算法简述算法实现算法简述有序向量去掉重复的元素算法实现// 有序向量的唯一算法, 返回删除的元素个数int sortVectorUnique(vector<T> &ages) { int old_size = ages.size(); int left_index = 0, right_index = 0; while (++ri...原创 2020-01-06 15:39:00 · 173 阅读 · 0 评论 -
向量整体置乱算法
场景使向量各个元素等概率出现在各个位置实现template<typename T>void permute(vector<T> &V) { for (int i = V.size(); i > 1; --i) { // 随机置乱向量 使各个元素等概率出现在各个位置 swap(V[i - 1], V(rand() % i));...原创 2020-01-06 11:39:50 · 277 阅读 · 0 评论