算法
文章平均质量分 73
带你从菜鸡到入门
繁星蓝雨
Happy coding!
展开
-
C++通过容器创建二叉树以及遍历(递归/非递归:前、中、后、层)————附带详细代码
文章目录0 背景1 生成二叉树1.1 二叉树的链式存储结构1.2 二叉树的创建2 遍历代码2.1 前序遍历2.1.1 递归2.2 非递归2.2 中序遍历2.2.1 递归2.2.2 非递归2.3 后序遍历2.3.1 递归2.3.2 非递归2.4 层序遍历3 完整的示例代码4 关联二叉查找树的创建0 背景在学习二叉树的遍历时,学习了很多遍历的方式,但是想要验证遍历的代码,奈何很多书籍都没有讲如何创建二叉树,网上也查了很多资料都是需要手动输入一个一个的节点通过递归来创建,不能传一个容器过去,通过容器中的元原创 2022-01-07 20:30:00 · 1459 阅读 · 0 评论 -
无头节点单链表基本操作(头插、尾插、删除)————附完整代码
文章目录0 背景1 创建链表操作1.1 头插法1.2 尾插法2 删除元素3 完整示例0 背景一般使用单链表多使用带头节点的单链表,好处是:1 对表首操作和在表的其他位置的操作一致,无需特殊处理;2 判链表是否为空时,头指针都是指向头节点的非空指针,空表和非空表的处理也得到统一。【如果不带头节点时,空链表的头指针为NULL】1 创建链表操作存储结构定义:typedef struct LNode{ int data;//数据 struct LNode* next;//指针域}原创 2020-11-09 12:36:30 · 2621 阅读 · 0 评论 -
巧用rand(),但是避免自身缺陷,生成随机整数
文章目录1 生成位于[0,n-1)个k不同的随机顺序的随机整数1.1 思路:1.2 实现代码:2 避免rand函数的缺陷生成随机数[0,n)范围内的随机整数2.1 思路2.2 实现代码1 生成位于[0,n-1)个k不同的随机顺序的随机整数1.1 思路:1 按序产生数组2 随即交换顺序1.2 实现代码:#include<cstdio>#include<cstdli...原创 2020-03-11 12:54:58 · 1135 阅读 · 0 评论 -
置换索引—————附带完整代码实现
文章目录1 描述2 思路3 实现代码3.1实验结果:3.2 代码1 描述设计和实现一个程序来产生一个置换索引。在一个置换索引中,每一个短语都是这个短语的每一个单词作为索引的。因此,假如有如下的输入:The quick brown fox jumped over the fence则输出: The quick brown fox jumped over the ...原创 2020-03-04 12:47:16 · 502 阅读 · 0 评论 -
大整数(高精度整数)概念、创建、输入、表示和四则运算(高精度的加减乘除)——附完整代码
文章目录1 大整数的存储1.1 概念1.2 存储结构1.3 读入1.4 比较大小2 大整数的四则运算2.1 高精度的加法2.1.1 思想2.1.1 模版代码2.1.2 加法示例2.2 高精度的减法2.2.1 思想2.2.2 模版代码2.3 高精度与低精度的乘法2.3.1思想2.3.2 模版代码2.3 高精度与低精度的除法2.3.1 思想2.3.2 模版代码2.3.3 高精度的除法模版2.3.4 高...原创 2020-02-29 23:25:28 · 3522 阅读 · 2 评论 -
平方探测法————附完整实现代码
文章目录1概念2 实现代码1概念开放地址法:之可存放新的空闲地址既向它的同义词表项开放,有向它的非同义表项开放。其数学递推公式为:Hi=(H(key)+di)%mH_{i}=(H(key) + d_{i})\%mHi=(H(key)+di)%m式中,i=0,1,2,...,k(k≤m−1)i = 0,1,2,...,k(k\leq m-1)i=0,1,2,...,k(k≤m−1);m表...原创 2020-02-29 12:15:51 · 3345 阅读 · 0 评论 -
素数(质数)判断、打印素数表(Eratosthenes筛法)、质因子分解————附完整代码
文章目录1 概念2 素数的判断2.1 思想2.2 实现代码3 素数表的获取3.1 朴素算法3.1.1 思想3.1.2 3 实现代码3.2 Eratosthenes筛法3.2.1 思想3.2.2 实现代码4 总结1 概念素数:除1和它本身之外,不能被其他数整数的一类数。即对于一给定的正整数n,如果对任意的正整数(1<a<n),都有n%a!= 0成立,那么称n是素数;否则如果存在a(...原创 2020-02-29 08:24:53 · 967 阅读 · 0 评论 -
分数的创建、化简、四则运算与输出————附带C/C++实现代码和示例
文章目录1 分数表示和简化1.1 表示1.2 分数化简1 分数表示和简化1.1 表示写成假分数的形式,无论分子比分母大或者小,都保留其原数。struct Fraction//分数{ int up, down;//分子、分母};用Fraction类型表示分数,或者定义数组表示一堆分数。制定表示的规则:1 使down为非负数。如果分数为负数,up为负数即可;2 如果...原创 2020-02-28 18:53:09 · 3441 阅读 · 0 评论 -
最大公约数和最小公倍数(欧几里得算法) ————附带代码实现
文章目录1 最大公约数1.1 概念1.2 求解1.3 实现代码2 最大公倍数1 最大公约数1.1 概念最大公约数:正整数a和b的所有公约数中最大的那个公约数。如:4和6的最大公约数是2,3和9的最大公约数是3。1.2 求解一般用gcd(a,b)来表示a和b的最大公约数,求解最大公约数常用欧几里得算法(辗转相除法)。欧几里得算法基于下面这个定理:gcd(a,b) = gcd(b, a...原创 2020-02-28 09:55:13 · 1259 阅读 · 0 评论 -
树状数组(单点更新、区间查询/区间更新、单点查询)(update和getSum函数)————附完整代码以及示例和示例代码
文章目录1 lowbit计算2 树状数组2.1 问题描述2.2 思想2.3 实现2.3.1设计函数getSum(x)2.3.1.1 思路2.3.1.2 实现代码2.3.2 设计函数update(x)2.3.2.1 思路2.3.2.2 实现代码2.4 应用2.4.1 问题描述(统计序列中在元素x左边比小的元素个数)2.4.2 实现代码2.4.3 扩展一——离散化(统计序列中在元素x左边比x大(右边比...原创 2020-02-25 20:58:00 · 1399 阅读 · 0 评论 -
在线查询(分块思想)——附带示例以及完整代码
文章目录1 问题描述2 解决方法1 问题描述给出一个非负整数序列A,元素的个数为N(A≤105,N≤105A\leq10^{5},N\leq10^5A≤105,N≤105),在有可能随时添加或删除元素的情况下,实时查询序列元素第K大的数(即把序列从小到大排序后,从左到右第K个数)。在线查询:在查询的过程中,元素可能发生改变(如插入、删除、修改)离线查询:在查询的过程中,元素不会发生变化。...原创 2020-02-25 00:21:44 · 835 阅读 · 0 评论 -
图解KMP算法(next数组、nextval数组、有限自动机【AC自动机】)———附带模版代码和完整示例
文章目录1 next数组1.1 概念1.2 暴力求解next数组1.3 递推求解next数组1.3.1 总结思路1.3.2 模版代码2 KMP2.1 概念2.2 暴力求解 O(nm)2.3 KMP O(n+m)2.3.1 思想2.3.2 模版思路2.3.3 模版代码2.3.4 统计模式串在文本串出现的次数2.3.4.1 思想2.3.4.2 实现代码2.3.4.3 时间复杂度计算2.4 nextva...原创 2020-02-24 21:15:23 · 2012 阅读 · 2 评论 -
字符串hash——附带完整代码
文章目录1 概念1.1 求字符串hash1.2 求字符串hash示例1.2.1 问题描述1.2.2 实现代码1.3 求字符串的子串的hash1.4 求字符串的子串hash 示例1.4.1 问题描述:1.4.2 实现代码:1.5 扩展1 概念1.1 求字符串hash字符串hash: 一个字符串S映射一个为整数,使得该整数可以尽可能唯一地代表字符产S。如把大写字母A~Z转换为0~25,H[i]...原创 2020-02-24 14:49:47 · 460 阅读 · 0 评论 -
经典动态规划模型归纳总结(最大连续子序列和、LIS、LCS、最长回文子串、数塔DP、DAG最长路、01背包、完全背包)
文章目录1 模型列举1.1最大连续子序列和1.2最长不下降子序列(LIS)1.3 最长公共子序列LCS1.4 最长回文子串1.5 数塔DP1.6 DAG最长路1.8 0-1背包1.9 完全背包2 总结2.1 类型一2.2 类型二1 模型列举1.1最大连续子序列和详细内容令dp[i]表示A[i]结尾的连续序列最大和(A[i]必须为连续序列的末尾)【不然就会产生多个相同的dp[i]】状态转...原创 2020-02-23 18:58:05 · 642 阅读 · 0 评论 -
背包问题(0-1背包、完全背包问题)(动规、滚动数组)——附完整代码
文章目录1 多阶段动态规划问题2 0-1背包问题2.1 问题描述2.2 求解2.2.1 暴力求解2.2.2 动态规划2.2.2.1 时间复杂度优化2.2.2.1 空间复杂度优化2.2.2.2 完整求解代码2.2.2.3 总结3 完全背包问题3.1 问题描述3.2 思路3.3 示例1 多阶段动态规划问题多阶段动态规划问题:有一类动态规划可解的问题,它可以描述为若干有序序列的阶段,且每一个阶段...原创 2020-02-23 17:54:05 · 737 阅读 · 0 评论 -
DAG(有向无环图)最长路——动态规划求解
文章目录1 问题描述1.1 求整个DAG的最长路径(即不固定起点和终点)1.2 固定终点,求DAG的最长路径2 求解问题12.1 求解最长路径长度2.2 求解最长路径2.2.1 路径序列的字典序3 求解问题23.1 求解最长路径长度3 应用3.1 实际例题1 问题描述1.1 求整个DAG的最长路径(即不固定起点和终点)1.2 固定终点,求DAG的最长路径2 求解问题12.1 求解最长路径...原创 2020-02-23 15:10:23 · 9908 阅读 · 5 评论 -
最长回文子串(动态规划,字符串hash+二分)——附完整实现代码
文章目录1 问题描述2 求解2.1 动态规划3 实现代码1 问题描述给出一个字符串,求字符串的最长回文子串的长度样例:字符串“ PATZJUJZTACCBCC”的最长回文子串为"ATZJUJZTA"长度为9.2 求解暴力方法:枚举子串两个端点i和j,判断在[i,j]区间内的子串是否回文。从时间复杂来看,枚举端点需要O(n2),判断回文需要O(n),因此总复杂度为O(n3)有人可能会想...原创 2020-02-23 10:03:40 · 1736 阅读 · 1 评论 -
最长公共子序列(Longest Common Subsequence, LCS )
文章目录1 问题描述2 求解2.1 动态规划3 实现代码1 问题描述给定两个字符串(或数字序列)A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以不连续)例如,字符串"sadstory"与"adminsorry"的最长公共子序列为"adsory",长度为62 求解如果用暴力的解法,设字符串A和B的长度分别为n和m,那么对两个字符串中的每个字符,分别有选择和不选两个决...原创 2020-02-22 22:28:35 · 559 阅读 · 0 评论 -
最长不下降子序列(LIS)————附完整代码
1 概述在一个数字序列中,找到一个最长子序列(可以不连续),使得这个子序列是不下降的例如:序列A={1,2,3,-1,-2,7,9}(下标从1开始),它的最长不下降子序列为{1,2,3,7,9}长度为5,还有一些其他的子序列{1,2,3}和{-2,7,9}等,但都是不最长的。2 求解用最原始的办法枚举每种情况,即对每个元素有取和不取两种情况,然后判断序列是否为不下降序列。如果是不下降序列...原创 2020-02-22 20:31:01 · 1287 阅读 · 0 评论 -
最大连续子序列和(状态的无后效性)——附带完整实现代码
文章目录1 问题描述2 实现代码3 总结1 问题描述给定一个数字序列A1.A2,…,An,求i,j ( 1 <= i <= j <= n),使得Ai+…+Aj最大,输出这个最大和。例如:-2 11 -4 13 -5 -2显然11 + (-4) + 13 之和最大,最大和为20如果使用暴力,枚举左端点和右端点,需要时间复杂度O(n2),而计算A[i]+…+A[j]需要O...原创 2020-02-22 17:55:03 · 496 阅读 · 0 评论 -
动态规划(最优子结构、重叠子问题)——附代码示例
文章目录1 概念2 递归写法3 递推写法4 总结4.1 区别4.2 应用条件4.2.1 最优子结构4.2.2 重叠子问题4.2.3 条件4.2.4 区别4.2.4.1 分治和动态规划4.2.4.2 贪心和动态规划1 概念动态规划(Dynamic Programming,DP):用来解决最优化问题的算法思想。一般来说,动态规划将复杂的问题分解为若干子问题,通过综合子问题的最优解来得到原问...原创 2020-02-22 17:29:27 · 3454 阅读 · 1 评论 -
关键路径(没有正环的图、有向无环图)———附带完整代码以及示例
文章目录1 概念1.1 AOV网、AOE网(图中都不应存有环)1.1.1 概念1.1.2 AOV转为AOE1.2 关键路径、关键活动1.3 最长路径2 求解关键路径2.1 准备:2.2 求数组ve2.2.1 思路2.2.2 实现代码2.3 求数组vl2.3.1 思路2.4 求关键路径2.4.1 思路( 先求点,再夹边)2.4.2 实现代码2.5 注意3 完整示例3.1 题目3.2 参考代码:...原创 2020-02-22 10:08:54 · 3483 阅读 · 1 评论 -
拓扑排序——附模版伪代码和完整代码
文章目录1 拓扑排序1.1 概念1.2 计算步骤1.3 实现代码1 拓扑排序1.1 概念有向无环图(Directed Acyclic Graph,DAG):有向图中任何一个顶点都无法通过一些有向边回到自身。拓扑排序:将有向无环图G的所有顶点排成一个线性序列,使得对图G中任意两个顶点u、v,如果存在边u->v,那么在序列中u一定在v的前面。具体含义见下图:1.2 计算步骤...原创 2020-02-21 20:09:26 · 2958 阅读 · 0 评论 -
图的全源最短路径之Floyd————附模版伪代码、完整代码以及示例
文章目录1 简介2 模版3 完整代码4 示例1 简介解决全源最短路径(对给定的图G(V,E),求任意两点u,v之间的最短路径)时间复杂度:O(n3)2 模版枚举顶点k ∈ [1,n] 以顶点k为中介点,枚举所有顶点对i和j(i ∈ [1,n],j ∈1[1,n]) 如果dis[i][k] + dis[k][j] <dis[i][j]成立 赋值dis[i][j] = ...原创 2020-02-19 11:17:26 · 2895 阅读 · 0 评论 -
SPFA的两种优化方法——SLF和LLL
文章目录一、SLF(Small Label First) 优化二、LLL(Large Label Last) 优化三、SLF+LLL四、优化效果五、其余代码前言[SLF](# 一、SLF(Small Label First) 优化)使用Markdown语法增加的跳转到“前言”的链接使用HTML语法增加的跳转到“前言”的链接一、SLF(Small Label First) 优化优化思路:将...转载 2020-02-19 09:12:38 · 868 阅读 · 3 评论 -
带负权图最短路径之Bellman-Ford和SPFA——附模版伪代码、完整代码和示例
1 Bellman-Ford(简称BF算法)可以解决带负权图的最短路径问题时间复杂度O(VE)1.1 模版for (int i = 0; i < n - 1; ++i)//执行n-1次操作,n为顶点数{ for (each edge u->v)//每轮操作都遍历所有边 { if(d[u] + length[u->v] < d[...原创 2020-02-19 07:28:22 · 1036 阅读 · 0 评论 -
无负权图最短路径之Dijkstra——附模版伪码、完整实现代码(邻接矩阵、邻接表)、示例和常考点
1 Dijkstra(单源点最短路径问题)1.1 最短距离1.1.1 伪代码//图G一般设为全局变量;数组d为源点到达各点的最短路径长度,s为起点Dijkstra(G, d[], s){ 初始化 for (循环n次) { u = 使d[u]最小的但还未被访问的顶点的标号; 记u已被访问; for (从u出发能到达的所...原创 2020-02-16 11:10:32 · 3836 阅读 · 0 评论 -
图概念、创建以及遍历(DFS、BFS)——附完整代码
1 概念1.1 定义由顶点集V(Vertex)和边集E(Edge)组成,其中V为有限非空集合,E表示图中顶点之间的关系(边)集合。1.2 相关概念1 度:与该定点相连边的条数。对于有向图来说,顶点的出边条数为该顶点的出度,入边条数为该定点的入度。2 创建2.1 邻接矩阵定义:对于二维数组G[N][N]两维分别表示图的顶点标号,即如果G[i][j]为1,说明顶点i和顶点j之间...原创 2020-02-13 21:49:02 · 1101 阅读 · 0 评论 -
哈夫曼树以及应用(哈夫曼编码)概念和建立——附带实现代码以及习题
1 概念1.1 哈夫曼树定义:n个带权叶子结点的二叉树中,带权路径长度最小的二叉树。权:树结点被赋予一个某种一亿的数值;带权路径长度:从树根结点到任意结点的路径长度(经过的边数)与该结点上权值的乘积。性质:1 哈夫曼树可以不唯一,但最小带权路径长度一定是唯一的;2 哈夫曼树只有度为1的结点;3 权越小的结点,离根结点越远。1.2 哈夫曼编码前缀码:任何一个字符...原创 2020-02-13 00:13:10 · 565 阅读 · 0 评论 -
堆(大小顶堆)的概念以及基本操作(建堆、增、删、堆排序)——附带完整代码以及示例
1 堆概念:一颗完全二叉树,树中的每个结点的值不大于(或不小于)其左右孩子的值。大顶堆:父结点的值大于或等于孩子结点的值,每个结点值都以它为根结点的子树的最大值;小顶堆:父结点的值小于或等于孩子结点的值,每个结点值都以它为根结点的子树最小的值。堆一般用优先队列,优先队列默认使用大顶堆,下面的讲解以大顶堆为例。2 基本操作2.1 建堆规则:从最后一个位置开始,从右到左,从下...原创 2020-02-12 17:29:14 · 2576 阅读 · 0 评论 -
并查集概念以及常见操作(合并、查找、路径压缩)————附带完整代码和示例
1 并查集1.1 定义:一种维护集合的数据结构,Union(合并),Find(查找),Set(集合)。1.2 操作:合并:合并两个集合;查找:判断两个元素是否为在一个集合1.3 性质并查集产生的每一个集合都是一棵树2 操作2.1 初始化//初始化void Init(int father[], int n){ for (int i = 0; i <= n; ...原创 2020-02-11 22:45:26 · 877 阅读 · 0 评论 -
平衡二叉树(AVL)的基本操作(查找、插入、建树)——附带完整代码以及示例
1 定义概念:在BST(二叉搜索树)的基础上,任意一个结点的左右子树的高度差(平衡因子)的绝对值不超过1。AVL取自于创建它的两位前苏联的数学家(G.M.Adelse-Velskil和E.M.Landis)的名字。2 基本操作2.1 存储结构struct node{ int data;//结点权值 int height;//当前子树高度 node *lchil...原创 2020-02-11 14:22:03 · 732 阅读 · 0 评论 -
二叉查找树(BST)基本操作(建立、查找并修改、插入、删除)——附带完整C++代码
1 建立二叉查找树typedef int ElemType;struct node{ ElemType data; node* lchild; node* rchild;};2 建立树2.1 新建结点//新建结点node* newNode(int v){ node* Node = new node; Node->data = v; ...原创 2020-02-02 12:25:04 · 548 阅读 · 0 评论 -
树的基本操作——附带C++实现代码
1 定义1.1 存储结构实现const int MAXN = 20;typedef int ElemType;struct node{ ElemType data;//数据域 vector<int> child;//指针域,存放所有子结点结点 int layer;//记录层号}Node[MAXN];//结点数组2 基本操作2.1 新建结点/...原创 2020-02-01 11:29:41 · 735 阅读 · 0 评论 -
二叉树【链式、静态】创建(前中序、后中序、层中序)与基本操作(增查改、前中后层遍历【递归/非递归】)————附C/C++实现代码
1 二叉树定义逻辑结构:树形结构——二叉树存储结构:链式存储结构C++:struct node{ ElemType data;//数据域 node* lchild;//左孩子指针 node* rchild; //右孩子指针 ElemType layer; //层次};C:typedef struct BiTNode { ElemTyp...原创 2020-01-31 09:49:56 · 441 阅读 · 1 评论 -
BFS学习心得——常见BFS模版、配习题讲解
1 BFS模版按层次的顺序进行遍历void BFS(int s){ queue<int> q; q.push(s); while(){ 取出队首元素top; 访问队首元素; 将队首元素出队; 将top的下一层结点未入队的结点全部入队,并设置为已入队; }}2 详细说明1 定义队列q,并将队首s入队2 写一个while循环,...原创 2020-01-20 00:06:02 · 321 阅读 · 0 评论 -
DFS学习心得——0-1背包、DFS常见题目类型
1 题目 0-1背包问题有n件物品,每件物品的重量为w[i],价值为c[i]。现在需要选出若干件物品放入一个容量为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中物品的价值之和最大,求最大价值(1<=n<=20)Sample Input:5 8 //5件物品,背包容量为83 5 1 2 2 //重量4 5 2 1 3 //价值Sample Out...原创 2020-01-19 23:58:31 · 381 阅读 · 0 评论 -
链表之增删查打印实现————附完整C++/C源码
1部分代码分解创建头插法(初始顺序与输入顺序相反)LNode* ListHeadInsert(LNode* &L){//头插法 LNode* p; ElemType e; L = new LNode;//创建头节点 L->next = NULL;//初始空链表 while(scanf("%d",&e) != EOF){ p = ne...原创 2020-01-17 23:08:57 · 237 阅读 · 0 评论 -
计算中缀表达式(连带括号) 附完整实现方法
1 思路:1,用string 保存读入的数值2,去除读入的空格3,创建结构体保存 数值 、符号 、是否是数字的判断结果4,把中缀表达式转换后后缀表达式每读入一个字符串把判断为是否数字的结果存储到结构体中用栈来存储符号,当栈顶元素优先级>=当前元素,就把栈顶元素弹到后缀表达式的队列中遇到 ‘(’ ,直接压入栈中;遇到 ‘)’ 从栈中一直弹符号,直到遇见’(’,最后连’('一...原创 2020-01-10 11:38:32 · 1175 阅读 · 0 评论 -
位图法排序和C++库程序的sort排序比较
1,源代码//3的完整版#include<cstdio>#include<cstdlib>#include<ctime>#include<iostream>#include<algorithm>using namespace std;#define N 10000000 //产生数的范围不超过N#define K ...原创 2019-12-31 16:08:44 · 210 阅读 · 0 评论