数据结构与算法
文章平均质量分 90
程序 = 数据结构 + 算法
铁头娃撞碎南墙
Get busy living or get busy dying.
展开
-
基于最短路的差分约束模型
1. 差分约束的功能求不等式组的可行解求满足不等式组的每一个变量的最值不等式组中每一个不等式形式如下:xi≤xj+ckx_i ≤x_j+c_kxi≤xj+ck其中,xix_ixi 和 xjx_jxj 是自变量, ckc_kck 是应变量。我们可以类比一下之前的最短路问题,假设存在一条从 jjj 走到 iii,边权为 ccc 的边。在进行最短路计算时,只要遇到 dist[j]>dist[i]+cdist[j] > dist[i] +cdist[j]>dist[原创 2021-09-07 12:32:04 · 118 阅读 · 0 评论 -
DFS的三大类型
深度优先搜索可以解决指数型、组合型、排列型等问题,很多小伙伴拿到DFS的问题时不知道该如何处理,这篇文章主要是帮助对DFS的写法有更深的理解。一. DFS实现指数型枚举(求集合的所有子集)题目来源:【递归实现指数型枚举】1. 题目描述从 1∼n1∼n1∼n 这 nnn 个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数 nnn。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好 111 个空格隔开。对于没有选任何数的方案,输出空行(空集)。本题有自原创 2021-09-04 00:47:26 · 1193 阅读 · 1 评论 -
DFS的搜索顺序与剪枝
1. DFS什么时候需要回溯?DFS分为两种搜索模式:内部搜索和外部搜索:为了便于大家的理解,我们用一个棋盘来模拟两种情况:1.1 内部搜索模式如果我们要求解棋盘上起点到终点的路径,那么对这张棋盘而言,下一个搜索状态与当前搜索状态一样,变化仅仅发生在同一个棋盘里,如下图:我们可以看到,在内部搜索模式中,即使搜索到了下一个状态,其本质还在同一个棋盘中。这种情况,之前的搜索结果不影响下一步的搜索,因此不需要回溯。这种搜索模式,一般而言不是传统意义上的“暴搜”的问题。1.2 外部搜索模式外部搜索原创 2021-09-03 18:41:16 · 478 阅读 · 0 评论 -
不同进制之间的转换
1. kkk 进制转 101010 进制转换公式:(an−1an−2...a0)k=(an−1kn−1+an−2kn−2+...+a0k0)10(a_{n-1}a_{n-2}...a_0)_k = (a_{n-1}k^{n-1}+a_{n-2}k^{n-2}+...+a_0k^0)_{10}(an−1an−2...a0)k=(an−1kn−1+an−2kn−2+...+a0k0)10但是我们在实际计算的时候并不会使用上述公式,而是使用将上述展开式变形的秦九昭算法进行转换。秦九韶算法原创 2021-08-24 18:08:29 · 235 阅读 · 0 评论 -
摩尔投票法(过半众数算法)
1. 题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。假设数组非空,如果不存在满足条件的数字,返回-1。思考题:假设要求只能使用 O(n)O(n)O(n) 的时间和额外 O(1)O(1)O(1) 的空间,该怎么做呢?样例1输入:51 2 1 1 3输出:1样例2输入:51 1 2 2 3输出:-12. 摩尔投票法摩尔投票算法的时间和空间都很低,时间复杂度为O(n),空间复杂度为O(1)。算法原理:每次从数组中找出一对不同的元素,将它们从数原创 2021-08-24 11:31:34 · 475 阅读 · 2 评论 -
红黑树的详解
1. 红黑树的提出既然平衡树家族中已经有了AVL树这种成员,并且其时间复杂度已经达到了 O(logh)O(logh)O(logh) 的要求,那么为啥要提出红黑树呢?我们来回顾一下AVL树的操作:插入操作:在AVL树中插入一个数,只要经过一次 O(1)O(1)O(1) 的旋转操作,AVL树局部乃至整个树的高度都能够复原。删除操作:在AVL树中删除一个数,有可能自底而上逐层引发 loghloghlogh 次的 O(1)O(1)O(1) 旋转,导致树型拓扑结构的剧烈变化。因此,在涉及到大量的动态操作原创 2021-08-22 00:47:38 · 799 阅读 · 0 评论 -
B-树的详解
文章目录一、B-树的提出二、B-树的定义三、B-树的查找四、B-树的插入4.1 分裂4.2 再分裂五、B-树的删除5.1 旋转5.2 合并一、B-树的提出从严格意义上讲,B-树并不是二分查找树。在物理上,B-树的每一个结点都可能包含多个分支。然而,在逻辑上将,B-树依然等效于传统的二叉搜索树。B-树的定义者,将其定义为一棵平衡的多路搜索树。为什么要提出B-树呢?最初,B-树的提出原因就是弥合不同存储级别之间在访问速度上的巨大差异,也就是实现高效的I/O。在现实生活中 系统存储容量的增长速度 <原创 2021-08-20 22:44:39 · 2324 阅读 · 0 评论 -
数组模拟AVL树(平衡二叉树)
一、AVL树的相关定义AVL树本质上还是一棵二叉搜索树,AVL=BST+AVL = BST +AVL=BST+ 平衡操作。AVL树的特点是:本身首先是一棵二叉搜索树。带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为 111。树中的每个左子树和右子树都是AVL树也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。为何引入AVL树?对于一般的二叉搜索树,其各操作的时间复杂度 O(log(h))O(log(h))O(log(h))原创 2021-08-19 20:01:35 · 1009 阅读 · 1 评论 -
数组模拟二叉搜索树(二叉排序树)
一、二叉搜索树的定义二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值它的左、右子树也分别为二叉搜索树二叉搜索树有一个特殊的性质:二叉搜索树的中序遍历是一个有序序列。二、二叉搜索树精华模板这里的二叉搜索树的构建是基于一个序列元素的依次插入。#include <iostream>#include <cstring>using nam原创 2021-08-18 20:54:43 · 2065 阅读 · 3 评论 -
数组模拟的【哈希集合】与【哈希映射】
一、哈希映射 hash(x)我们知道,std::unordered_map是一种非常高效的哈希映射,他相对于红黑树实现的std::map抛弃了有序性,但是提高了效率,插入和查询操作时间复杂度仅仅为 O(1)O(1)O(1)。但是,在算法考试、算法竞赛中,std::unordered_map常常因为常数太大,非常容易被出题人卡掉。因此我们需要换一种更加高效的数组模拟的方法。在看下面的内容之前,请先阅读这篇文章:【AcWing 840. 模拟散列表】,来了解std::unordered_set的数组实现思原创 2021-08-17 18:17:45 · 432 阅读 · 0 评论 -
AcWing 859. Kruskal算法求最小生成树
题目来源:AcWing 859. Kruskal算法求最小生成树一、题目描述给定一个 nnn 个点 mmm 条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。给定一张边带权的无向图 G=(V,E)G=(V,E)G=(V,E),其中 VVV 表示图中点的集合,EEE 表示图中边的集合,n=∣V∣n=|V|n=∣V∣,m=∣E∣m=|E|m=∣E∣。由 VVV 中的全部 nnn 个顶点和 EEE 中 n−1n−1n−1原创 2021-08-15 11:25:10 · 535 阅读 · 0 评论 -
AcWing 858. Prim算法求最小生成树
题目来源:AcWing 858. Prim算法求最小生成树一、题目描述给定一个 nnn 个点 mmm 条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible。给定一张边带权的无向图 G=(V,E)G=(V,E)G=(V,E),其中 VVV 表示图中点的集合,EEE 表示图中边的集合,n=∣V∣n=|V|n=∣V∣,m=∣E∣m=|E|m=∣E∣。由 VVV 中的全部 nnn 个顶点和 EEE 中 n−1n−1n−1 条边构原创 2021-08-15 10:03:09 · 487 阅读 · 0 评论 -
平衡二叉树、B树与B+树
文章目录一、引言二、为什么二叉查找树不行三、B树是什么四、B树的查找五、从B树到B+树一、引言本文将为大家介绍B树和B+树,首先介绍了B树的应用场景,为什么需要B树;然后介绍了B树的查询和插入过程;最后谈了B+树针对B树的改进。 在谈B树之前,先说一下B树所针对的应用场景。那么B树是用来做什么的呢?B树是一种为辅助存储设计的一种数据结构,普遍运用在数据库和文件系统中。举个例子来说,数据库大家肯定都不陌生,比如现在有一张表,其中有100万条记录,现在要查找其中的某条数据,如何快速地从100万条记录中找转载 2021-08-14 11:54:39 · 287 阅读 · 0 评论