- 博客(16)
- 收藏
- 关注
原创 算法的空间复杂度
空间复杂度(王道笔记)—>空间开销(内存开销)与问题规模n之间的关系程序运行时的内存需求:例一1.程序代码所占内存(这部分内存大小固定,与问题规模无关)2.局部变量,参数等最后算的总和就是空间复杂度,和时间复杂度类似,都按阶数来看S(n)=O(1)(注:如果是常数级的,则可以称算法原地工作)这里要说明的是,无论问题规模怎么变,算法运行所需的内存空间都是固定的常 量例二例三例四(函数递归调用产生内存开销)1.2....
2021-07-07 16:09:43
272
原创 算法的时间复杂度(王道笔记)
首先解释下时间复杂度为什么得在运行前估计,主要原因有以下几点:大家的机器性能不同,同样的程序不同机器跑出来时间不一样使用的编程语言不同,往往越高级的语言效率越低,例如Java效率就要比C低,因为Java是更高级的语言和编译程序产生的机器指令质量有关有些事情是不能去事后统计的,例如重要军事的精确测量我们估算法的时间复杂度,事实上是要探求算法时间开销T(n)与问题规模(n)的关系—>T=T(n)举个栗子//算法一void loveyou(int n){ //n为问题规模 i
2021-07-07 11:10:25
997
原创 2021-02-24
数据结构(二)Tire树高效地存储和查找字符串的集合的数据结构。1.存储在根节点之后像一棵树一样依次延伸,没有就创建,有就沿着走下去;例如我们存储abcdef,abdef,aced,bcdf,bcff,abc这些字符串,我们还需要在一个字符串结尾处标记来确认查找。如下图所示:2.查找例如查找aced,依次从根节点往下找都是存在的,而且结尾处有标记则查找到了;再例如查找abcf,我们从c找f这部是不存在的所以查找不了;例如查找abcd,虽然都能找到但结尾处没有标记所以查找不了。代码实现存储和
2021-02-24 18:31:01
182
原创 2021-02-17
lowbit用法离散化一组数据范围很大但是个数却不是很多的时候,我们总不能暴力开一个包括所有范围的数组,这时我们需要用到映射,映射的过程即为离散化。做法:先去重vector<int> alls;sort(alls.begin(),alls.end()); //排序alls.erase(unique(alls.begin(),alls.end()),alls.end()); //去重...
2021-02-18 17:24:12
139
原创 2021-02-10
快速排序-分治1.确定分界点:q[l] q[r] q[(l+r)/2] q[random]2.*调整范围,使得左边一部分的数都<=分界点,右边部分的数都>=分界点3.递归处理左右两段使得两段排好序,也就排好了整体#include <iostream>#include <cstdio>using namespace std;const int N = 100010;int q[N];void quick_sort(int q[],int l,i
2021-02-13 20:54:53
120
原创 博弈论
博弈论简单介绍就是两个对象在进行某个斗争,按照某种规则,会有先手必赢和后手必赢的局面产生,我们就是要根据不同的规则去研究策略。然后关于博弈论的话,常见的题目都是公平组合游戏;公平组合游戏呢…就是游戏人数为2,二者轮流做出决策,且双方都知道游戏规则;任意一个游戏者在某一确定状态可做出的决策集合只与当前状态有关而与游戏者无关;游戏中的状态不可能多次抵达,游戏以玩家无法行动为结束,且游戏一定会在有限步后以非平局结束;ps:大部分棋类游戏都不是公平组合游戏,像是国际象棋、中国象棋、围棋、五子棋…(因为双方
2021-02-09 10:14:53
364
原创 最短路-弗洛伊德算法&狄克斯特拉算法
最短路1.多源最短路定义:现有n个地点,求任意两点间的最短距离算法:弗洛伊德(floyd)算法思想:让每一个点成为中转点,进行"松弛"操作;所谓松弛操作就是要搞出 A+B<C 的效果,举个栗子咱们从软院到计算机学院要走6个单位,但是我们让文学院作为中转点的话,就有了2+3=5<6的效果,这就是进行了松弛操作。我们尝试以不同的点进行松弛操作,保留最近的那种。那么我们要实现弗洛伊德算法的存储的话,一般都是用邻接矩阵实际上就是二维数组来实现的。以上图为例子>我们把它转换成表格,
2021-02-05 18:38:18
697
1
原创 搜索——深搜+广搜
搜索蕴含递归的思想,通过不停的试探去寻求解常用方法有:暴力的搜索、深搜(DFS)、广搜(BFS)引入像是图的遍历一样,按照某个规则去访问图中的所有顶点,且每个顶点只被访问一次。深度优先遍历(DFS)就是要走就先走完一整条路,再返回去走别的可能的路。举个栗子:它的顶点访问次序就是以下几种:V1>V2>V4>V8>V5>V3>V6>V7V1>V2>V5>V8>V4>V3>V6>V7V1>V2>V
2021-02-01 17:20:07
6172
5
原创 筛法1&快速幂&容斥原理
筛法&快速幂&容斥原理>>筛法埃氏筛法筛质数求1~n间的质数个数const int N=1000010;int n,primes[N],cnt; //primes[]记录质数 cnt记录质数个数bool st[N]; //来标记它是质数还是合数,初始化为0即为false规定为质数using namespace std;void get_primes(int n){ for(int i =2;i<=n;i++) { i
2021-01-29 17:38:48
290
原创 图论初学
图论学习基础信息定义:图作为一种数据结构,表现的是若干对象的集合,以及这些对象间关系的集合。比如用图表现一个班级里各个同学的关系,则每个同学就是一个对象,所有的同学以及他们之间所有的关系的集合就是图名词解释:1.权值:边上的值,某点到某点的值2.加权无向图:没有方向但有权值3.加权有向图:既有方向又有权值4.有向图:A—>B B—>C5.无向图:A—>B B—>A ;A,B互相连通6.完全图:完全图是一个简单的无向图,其中每对不同的顶点之间都恰连有一条边相连。
2021-01-29 12:22:39
272
1
原创 前缀和、差分、双指针
前缀和&差分&双指针>>前缀和前缀和定义:一个数组的某项下标之前且包括此项元素的所有数组元素的和。一维前缀和设b[]为前缀和数组,a[]为原数组一维前缀和公式:b[i]=b[i-1]+a[i]若要计算区间[l,r]的和,使用公式sum=a[r]-a[l-1]代码如下:int b[10];int a[10];int main(){ for(int i = 1;i<=9;i++) a[i]=1; for(int i
2021-01-29 10:27:49
255
原创 常用算法模板总结
算法模板总结(loading…)>>快排void quick_sort(int arr[],int l,int r){ int i=l-1,j=r+1,x=arr[l+r>>1]; //x为分割点 while(i<j) { do i++;while(arr[i]<x); do j--;while(arr[j]>x); if(i<j) swap(arr[i],arr[j]);
2021-01-28 13:06:17
156
原创 货仓系统Dp
货仓系统(DP问题)给定 V 种货币(单位:元),每种货币使用的次数不限。不同种类的货币,面值可能是相同的。现在,要你用这 V 种货币凑出 N 元钱,请问共有多少种不同的凑法。输入格式:第一行包含两个整数 V 和 N。接下来的若干行,将一共输出 V 个整数,每个整数表示一种货币的面值。输出格式:输出一个整数,表示所求总方案数。数据范围1≤V≤25,1≤N≤10000答案保证在long long范围内。输入样例:3 101 2 5输出样例:10>&g
2021-01-24 19:31:41
221
原创 高精度乘除法
高精度乘除法注意:和加减法一样都要倒着存进去,除法可以不用,但为了统一索性都用倒着存储>>乘法实例#include <iostream>#include <algorithm>#include <cstring>#include <vector>using namespace std;vector<int> mul(vector<int> A,int b){ vector<int>
2021-01-24 11:03:04
172
原创 高精度加减法
高精度加减法注意:1.高精度问题都倒着存,便于进位 2.读入的时候最后不要忘记-‘0’>>加法实例#include <vector>#include <iostream>#include <algorithm>#include <cstring>using namespace std;vector<int> add(vector<int> A,vector<int> B){ vec
2021-01-23 22:59:43
157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅