![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
Lechrond
吉良吉影只想过平静的生活
展开
-
快速幂
快速幂的一般格式为:给定三个正整数aaa、bbb、mmm,求ab%ma^b\%mab%m。如果按照时间复杂度为O(b)O(b)O(b)的写法,在 bbb 超过10810^8108时就很容易超时,因此需要引入快速幂。递归写法快速幂基于以下两个条件:如果 bbb 是奇数,那么有 ab=a∗ab−1a^b=a*a^{b-1}ab=a∗ab−1如果 bbb 是偶数,那么有 ab=ab/2∗ab...原创 2019-04-08 13:05:13 · 96 阅读 · 0 评论 -
拓扑排序
定义拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对于图G中的任意两个顶点u、v,如果存在边u->v,则u一定排在v的前面,这个序列称为拓扑序列。算法流程定义一个队列Q,把所有入度为0的结点加入队列。取出队首结点,输出,然后把所有该结点可以到达的结点的入度减1,如果某个顶点的入度减为0,则将其加入队列。反复进行第2步操作,直到队列为空,如果此时所有的结点都已经加入拓扑序...原创 2019-08-30 13:47:05 · 121 阅读 · 0 评论 -
随机选择算法
随机选择算法可以对任何输入都以O(n)的时间复杂度找出无序数组中第K大的元素。切分int partition(int A[],int left,int right) { int tmp=A[left]; while(left<right) { while(left<right && A[right]>tmp) right--; A[left]=A[...原创 2019-08-16 17:24:15 · 226 阅读 · 0 评论 -
区间贪心
区间不相交问题问题描述给出N个开区间(x,y),从中尽可能选出多的开区间,使这些开区间两两不相交。例如区间(1,3)、(2,4)、(3,5)、(6,7)解决方案把所有开区间按照左端点从大到小进行排序,左端点相同时按照右端点从小到大进行排序,按这样的顺序依次选出不相交的区间。#include<cstdio>#include<cmath>#include<...原创 2019-08-12 19:19:21 · 109 阅读 · 0 评论 -
快速排序
元素的切分调整一个序列,取出第一个元素,使得该元素左边的元素都小于它,右边的元素都大于它。int partition(vector<int> &v,int left,int right) { //存储最左的元素 int tmp=v[left]; while(left<right) { //找到第一个小于tmp的元素,放到left的位置 while(lef...原创 2019-08-16 14:47:16 · 71 阅读 · 0 评论 -
回溯法解决n皇后问题
在全排列的基础上进行求解,如果在到达递归边界前的某层已经不符合,就不需要深入递归,直接进入下一轮或者跳出当前的递归层,保证当到达递归边界时表示一定符合条件。#include<cstdio>#include<cmath>using namespace std;const int MAXN=100;bool vis[MAXN];//记录皇后所在的行数int P[...原创 2019-08-12 15:48:11 · 117 阅读 · 0 评论 -
归并排序
合并函数2-路归并排序的核心在于如何将两个有序序列合并为一个有序序列。void merge(vector<int>& a,int L1,int R1,int L2,int R2) { int i=L1,j=L2; //定义一个足够大的临时容器 int size=(R1-L1+5)*2; vector<int> tmp(size); int index=...原创 2019-08-15 21:42:22 · 272 阅读 · 0 评论 -
树和二叉树
树树可以没有结点,被称为空树。树的层次从根结点开始算,根结点为第一层。把结点的子树棵树称为结点的度,树中结点最大的度称为树的度。满足连通、边数等于结点数减一的结构一定是一棵树。叶子结点被定义为度为0的结点,因此在树只有根结点时,根结点也是叶子节点(此时度为0)。结点的深度从根结点(深度为1)开始计算,结点的高度从叶子结点(高度为1)开始计算。树的深度和高度就是结点中的最大值,因此对树...原创 2019-08-20 20:12:43 · 168 阅读 · 0 评论 -
链表的定义和基本操作
结构体定义包括数据域和指针域。struct Node { int data; Node* next;};创建链表通过数组来创建带头节点的链表。Node* create(int A[],int n) { //创建头指针、前驱指针 Node *head,*pre; head=new Node; head->next=NULL; pre=head; //循环新建节点...原创 2019-08-20 19:42:30 · 290 阅读 · 0 评论 -
并查集
定义并查集是一种维护集合的数据结构,支持以下两种操作:合并:合并两个集合。查找:判断两个元素是否在一个集合。对同一个集合来说只存在一个根结点,且将其作为所属集合的标识。基本操作初始化一开始,每个元素都是独立的集合,所以令所有father[i]=i。for(int i=0; i<n; i++) { father[i]=i;}查找(路径压缩)反复地寻找元素的父亲节点...原创 2019-08-23 21:29:20 · 128 阅读 · 0 评论 -
二分算法
二分查找二分查找需要找到序列中存在的元素的下标,如果值不存在就返回-1,因此循环的条件需要设置为left<=right,当left>right说明所查找的元素不存在,循环中止。int binarySearch(int a[],int left,int right,int target) { //当左端点小于等于右端点时进行循环 while(left<=right) { ...原创 2019-08-14 21:58:09 · 72 阅读 · 0 评论 -
平衡二叉树(AVL树)
定义AVL树是一棵二叉查找树,对于AVL树的任意结点来说,其左子树和右子树的高度之差的绝对值不超过1,其中左子树的高度与右子树高度之差称为平衡因子。因为需要对每个结点计算平衡因子,所以需要加入一个变量height。struct node { int data; int height; node *lchild,*rchild;};前备操作获取高度int getHeight...原创 2019-08-23 16:54:37 · 172 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法Dijkstra算法解决的是单源最短路径问题,即给定图G(V,E)G(V,E)G(V,E)和起点sss,求从给定起点sss到其他顶点的最短距离。文章目录Dijkstra算法算法思想程序模板邻接矩阵版邻接表版第二标尺算法思想设置集合VVV为未访问的顶点集,SSS为已被访问的顶点的集合,然后执行n次(顶点个数)下面两步:①每次从集合VVV中选择与起点sss的最短距离最小的...原创 2019-04-25 22:38:04 · 137 阅读 · 0 评论 -
快速乘
当计算a∗b%ma*b\%ma∗b%m的时候,往往较大的数在计算a∗ba*ba∗b时会超出long long的范围,因此就可以使用快速乘的思想,快速乘和快速幂的思想非常相似,快速乘的原理就是利用乘法分配律,把bbb转化为二进制数的形式,跟快速幂的做法相似:遍历每一位,在每一轮都把aaa扩大为自身的两倍,如果当前位是1,则加上当前的aaa。示例代码如下:typedef long long LL;...原创 2019-04-08 13:32:08 · 155 阅读 · 0 评论 -
字符串匹配问题
定义给定两个字符串text和pattern,需要判断字符串pattern是否是字符串text的字串。把text称为文本串,pattern称为模式串。next数组定义next数组假设有一个字符串s,那么它以i号位作为结尾的子串就是s[0···i]。使得next[i]表示使字串s[0···i]的前缀s[0···k]等于后缀s[i-k···i]的最大的k(注意前后缀不能是字符串本身),如果找不...原创 2019-09-09 16:39:45 · 863 阅读 · 0 评论