![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
本科阶段学习的一些算法与数据结构,多为基础,基本涵盖了数据结构考研所要求掌握的内容
chengzic1999
去码头整点薯条
展开
-
表达式求值(构建逆波兰式)
中缀表达式就是我们习惯上的 a∗(b+c)a*(b+c)a∗(b+c) ,运算符在两个操作数的中间。后缀表达式是将运算符按照优先级顺序、放在操作数后面,abc+∗abc+*abc+∗ ,越靠前的运算符优先级越高在中缀表达式中,运算符的优先级不同且存在括号,使得一个算术表达式在计算时,运算符的运算顺序不是平铺直叙的,对于计算机而言,后缀表达式的计算更方便,就需要构建逆波兰式(把中缀表达式转换成后缀表达式)构建逆波兰式步骤:首先需要设置一个符号栈,初始化压入一个 # ,认为 # 的优先级低于一切符号。扫原创 2020-12-02 16:30:23 · 524 阅读 · 0 评论 -
大数运算模板
大整数相加个人认为用 vector<int> 是最好的,也见过很多用字符串来写,但是字符串的单位是char,只有8位,乘法运算中,可能会出现溢出的问题。模拟竖式运算。把数的每个数字放到 vector<int>,然后把数组倒过来,方便做进位运算。因为最高位补1,对数组来说 push_front 代价太大。做完运算后逆序输出。例题: https://www.luogu.org/problem/P1601#include <iostream>#include <原创 2020-12-02 16:03:42 · 120 阅读 · 0 评论 -
N皇后问题(各种优化)
0.问题引入N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击),问有多少种摆法。题目链接:https://www.luogu.org/problemnew/show/P12191、普通回溯深搜+回溯,它是一种系统地(能找到全部的解)搜索问题的解的方法。基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。算法思想:1. 在第k(1≤k≤N)行选择一个位置,判断这个位置是否可以摆,可以摆就进入第原创 2020-12-02 15:48:39 · 2023 阅读 · 0 评论 -
数据结构——平衡二叉树(AVL树)
引入对于二叉排序树,构建一个二叉排序树,如果构建序列是完全有序的,则会出现这样的情况:显然这种情况会使得二叉搜索树退化成链表。当出现这样的情况,二叉排序树的查找也就退化成了线性查找,所以我们需要合理调整二叉排序树的形态,使得树上的每个结点都尽量有两个子结点,这样整个二叉树的高度就会大约在log(n)log(n)log(n) 左右,其中 nnn 为结点个数。基本性质AVL树也称为平衡二叉树,是一种自平衡的二叉排序树,本质上仍然是一颗二叉排序树,只是增加了“平衡”的要求,平衡是指,对AVL树中任何节点原创 2020-11-25 09:10:27 · 2222 阅读 · 0 评论 -
数据结构——二叉排序树(二叉搜索、查找树)
引入基本性质:二叉排序树(又叫二叉搜索、查找树) 是一种特殊的二叉树,定义如下:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值;左、右子树也分别为二叉排序树。不允许有键值相同结点。【如果真的出现了,那么放在左子树,右子树是无所谓的】二叉排序树的中序序列是有序的二分查找与二叉排序树二分查找也称为折半查找,要求原线性表有序,它是一种效率很高的查找方法。如果在需要进行频繁修改的表中采用二分查找,其效率也是非常低下的,因为顺序原创 2020-11-24 15:14:51 · 2214 阅读 · 0 评论 -
数据结构——二叉树
引入在数据结构中,将现实生活中的树根抽象为根节点(Root)树叉抽象为结点(Node),将叶子抽象为(Leaf),将树枝抽象为边(Edge),且一条边只用来连接两个结点,互为父子节点。基本性质:二叉树_百度百科、完全二叉树、满二叉树二叉树的性质二叉树树可以没有结点,这种情况下把树称为空树。树的层次从根节点开始算,即根节点算第111层。【也有的教材规定根结点在第000层,这里全部以111层为准】把结点的子树颗数称为结点的度(degree),树中所有结点的最大的度称为树的度(也叫做树的原创 2020-11-24 08:15:25 · 901 阅读 · 0 评论 -
迷宫寻路问题全解 DFS、BFS、A*
1、深度优先搜索(DFS)+回溯最基本的板子:void DFS(int x,int y){ if (x,y都与目标点相同) { 得到一个解; } else { for (int i = 1; i <= 四个方向; i++) if (满足进一步搜索条件) { 为进一步搜索所需要的状态打上标记; DFS(to_x, t原创 2020-11-22 23:27:30 · 898 阅读 · 0 评论 -
数据结构——并查集
基本概念并查集是一种维护集合的数据结构,“并”,“查”,“集” 三个字分别取自 Union(合并),Find(查找),Set(集合)。并查集是若干个不相交集合,能够在 O(1)O(1)O(1) 实现两个集合的合并,判断两个元素是否属于同一集合应用,如其求无向图的连通分量个数、实现kruskal算法求最小生成树。并查集的实现方法就是一个数组:int pre[N];其中 pre[i] 表示元素 i 结点的父节点,pre[i] 和 i 结点属于同一集合。例如:pre[1] = 2 就表明元素1的父节点原创 2020-11-22 14:53:28 · 153 阅读 · 0 评论 -
数据结构——堆(优先级队列)
基本性质优先级队列,也叫二叉堆、堆(不要和内存中的堆区搞混了,不是一个东西,一个是进程的内存区域,一个是数据结构)。堆的本质上是一种完全二叉树,分为:最小堆(小根堆):树中每个非叶子结点都不大于其左右孩子结点的值,也就是根节点最小的堆,图(a)。最大堆(大根堆):树中每个非叶子结点都不小于其左右孩子结点的值,也就是根节点最大的堆,图(b)。以下操作均以大根堆为例存储方式堆本质上是一颗完全二叉树,使用数组进行存储,从 a[0]a[0]a[0] 还是 a[1]a[1]a[1] 开始存原创 2020-11-21 20:47:05 · 386 阅读 · 0 评论 -
十大经典排序算法(附自实现排序算法演示软件)
自己使用 Unity 实现的一个排序算法演示系统:https://github.com/czc1999/sorting-visualization基本概念**稳定性的概念:**假定在待排序的序列中,arr[i] 等于 arr[j],且 arr[i] 在 arr[j] 之前,而在排序后的序列中,保证 arr[i] 仍在 arr[j] 之前,则称这种排序算法是稳定的;否则称为不稳定的。**稳定性的意义:**如果只是简单的进行数字的排序,那么稳定性没什么意义。但是,比如对不同班级的同学,先按照分数排序,再按原创 2020-11-21 16:02:50 · 925 阅读 · 0 评论 -
图论——割点(关节点) Tarjan 算法
引入连通图 在一个无向图GGG中,若从顶点 iii 到顶点 jjj 有路径相连,则称 iii 和 jjj 是连通的。如果图中任意两点都是连通的,那么图被称作连通图。如果 GGG 是有向图,则称为强连通图(注意:需要双向都有路径)。如果是单向连通,则称GGG为单向连通图。割点(关节点) 在无向连通图 G=(V,E)G=(V,E)G=(V,E) 中: 若对于 x∈Vx\in Vx∈V, 从图中删去节点 xxx 以及所有与 xxx 关联的边之后, GGG 分裂成两个或两个以上不相连的子图, 则称原创 2020-11-21 14:46:40 · 2264 阅读 · 0 评论 -
图论——AOE网络及关键路径
引入AOE网和AOV网上一篇的拓扑排序中提到了 AOV\mathrm{AOV}AOV 网(Activity On Vertex Network),与之相对应的是 AOE\mathrm{AOE}AOE 网(Activity on edge network),即边表示活动的网。AOV\mathrm{AOV}AOV 用顶点表示活动的网,描述活动之间的制约关系。AOE\mathrm{AOE}AOE 是带权值的有向图,以顶点表示事件,以边表示活动,边上的权值表示活动的开销(如项目工期)。 AOE\mathr原创 2020-11-20 15:58:43 · 2221 阅读 · 0 评论 -
图论——AOV网络及拓扑排序
引入有向无环图(DAG)如果一个有向图不存在环,也就是任意结点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图AOV 网络在有向图中,用顶点表示活动,用有向边$ < V_i, V_j > $表示活动 iii 是活动 jjj 的必须条件。这种有向图称为用顶点表示活动的网络(Active on vertices),简称AOV网络。在AOV网络中,如果活动ViV_iVi必须在VjV_jVj之前进行,则存在有向边<Vi,Vj><V_i, V_j><V原创 2020-11-20 10:56:51 · 4187 阅读 · 0 评论 -
图论——最短路径 深/宽度优先搜索算法、Dijkstra算法、Floyd算法
问题引入地图上有很多个城市,已知各城市之间距离(或者是所需时间,后面都用距离了),一般问题无外乎就是以下几个:从某城市到其余所有城市的最短距离【单源最短路径】所有城市之间相互的最短距离【任意两点最短路径】各城市距离一致,给出需要最少中转方案 【最少中转】深度优先搜索适用范围:深搜求最短路径的思想和用深搜迷宫寻路很像,能找出所有的从起点到目标点的路径,选出其中最短的一条。但一般不用,只能处理 n<10n<10n<10 的情况此算法仅供娱乐参考,实际不会用它的,因为算法复杂原创 2020-11-20 09:15:54 · 2038 阅读 · 2 评论 -
图论——最小生成树 kurskal算法、prim算法
基本概念树(Tree)如果一个无向连通图中不存在回路,则这种图称为树。生成树 (Spanning Tree)无向连通图 G\mathrm GG 的一个子图如果是一颗包含 G\mathrm GG 的所有顶点的树,则该子图称为 G\mathrm GG 的生成树。生成树是连通图的极小连通子图。这里所谓极小是指:若在树中任意增加一条边,则将出现一条回路;若去掉一条边,将会使之变成非连通图。最小生成树一个带权值的连通图,用 n−1n-1n−1 条边把 nnn 个顶点连接起来,使得连接起来的权值最小。原创 2020-11-20 08:38:44 · 932 阅读 · 0 评论 -
图论——图的基本性质与表示
图的基本性质顶点(vertex)上图中黑色的带数字的点就是顶点,表示某个事物或对象。由于图的术语没有标准化,因此,称顶点为点、节点、结点、端点等都是可以的。叫什么无所谓,具体代指什么才是关键。边(edge)上图中顶点之间蓝色的线条就是边,表示顶点之间的逻辑关系,事物与事物之间的关系。有向/无向图(Directed Graph/ Undirected Graph)有向图和无向图,两者的区别在于,有向图中的边是有方向性的。(可以把无向图视为“双向”的有向图,构造无向图用的就是这种方法)一般到底是原创 2020-11-19 08:36:10 · 2106 阅读 · 0 评论 -
数论——快速幂全解(模平方根算法)
模平方根算法求a的b次方有库函数pow(a, b),可是它返回值是double类型,而且在不同开发环境下,数据有精度误差,而且b稍微大一点,必然会超 int 范围。所以,就需要模平方根算法,也就是通常说的快速幂。原理:求 ama^mam 可如下进行,其中 a,ma,ma,m 是正整数:将 mmm 表示为二进制形式 bkbk−1…b0b_kb_{k-1}\dots b_0bkbk−1…b0 ,即:m=bk2k+bk−12k+1+⋯+b12+b0m=b_k2^k+b_{k-1}2^{k+1}+\d原创 2020-11-18 10:43:09 · 1495 阅读 · 1 评论 -
数论——素数问题
素数的判定试除法(1)普通复杂度:O(n)O(n)O(n)bool prime(int x){//判断x是不是质数,是返回true,不是返回false if(x <= 1) return false; for(int i = 2; i < x; i ++){ if(x % i == 0) return false; } return true;}(2)改进复杂度:O(n)O(\sqrt{n})O(n)bool prime(i原创 2020-11-16 20:51:13 · 684 阅读 · 0 评论