算法导论
九幽孤翎
蜉蝣只有认清自己的渺小,才能有化茧成蝶的一天
展开
-
算法导论学习笔记——32 字符串匹配
研究问题: 解决方法与时间复杂度 32.1朴素字符串匹配 就是以目标串中的每个元素为起点进行匹配,当匹配到模式串尾部,匹配成功,不然从下个元素重新匹配 32.2Rabin-Karp 算法 主要思想,通过预处理模式串与目标串第1到i个数之和对某个数的模,然后快速筛掉无效匹配 32.3 ac自动机 还没学,以后再补 32.4 Knuth-Morris-Pratt 主要思想: 优化朴素的暴...原创 2020-03-24 14:47:42 · 481 阅读 · 0 评论 -
算法导论学习笔记——15 动态规划
15 动态规划 动态规划的本质就是状态的转移, 新状态=原状态+改变状态的收益, 保存每种状态的值,用空间换时间, 节省递归解决重复子问题的时间。 动态规划两种实现方法: 1.带备忘的自顶向下法 仍用递归解决问题,但每一步保存当前状态的值 下次直接调用这个值,与记忆化dfs的想法类似。 2.自底向上法 当子问题的求解只依赖于某个更小的子问题时, 可以按规模从小到大求解。 ...原创 2020-03-17 14:56:17 · 488 阅读 · 0 评论 -
算法导论学习笔记第26章 & acm专题训练7——最大流
26最大流 1.研究的问题 可以把最大流问题用货运公司的运货来模拟。有一个源点持续不断地产生新货物,并通过有限条道路运往一个汇点,每条道路有限定的容量,且进入一个节点的速度和出一个节点的速度相同。求源点到汇点的最大速率。 2.运用算法条件 容量值为非负数,对于两个节点,u,v,(u,v)与(v,u)至多存在一个,如果不连通,令c(u,v)=0,不允许自循环,图必须连通. c(u,v)指的是容量,f...原创 2020-03-09 19:24:32 · 873 阅读 · 0 评论 -
算法导论学习笔记——12(补充)二叉树的遍历
1.中前序推层序遍历 #include <bits/stdc++.h> using namespace std; const int maxn=50; int mid[maxn],fr[maxn]; struct node{ int l,r; }a[maxn]; int build(int la,int ra,int lb,int rb)//la,ra表示中序遍历 lb,rb表示前...原创 2020-03-02 03:47:41 · 361 阅读 · 0 评论 -
算法导论学习笔记——12.1二叉搜索树
map<int,int>mp[maxn]; void insert(int idx) { if(!num[idx]) { num[idx] = m; mp[m]=idx; return ; } if(m > num[idx]) insert(idx * 2); else insert(idx * ...原创 2020-03-02 03:42:50 · 429 阅读 · 0 评论 -
算法导论学习笔记——10.2链表
10.2链表 个人对链表的理解——一个简单的结构体 struct node { int l,r,key; }a[maxn]; int ListSearch(k) { int x=st; while(x!=-1&&a[x].key!=k) x=a[x].r; return x; } void ListInsert(int x) { a[x].r=st; a[s...原创 2020-03-02 02:56:20 · 370 阅读 · 0 评论 -
算法导论学习笔记——8.2计数排序
8.2计数排序 #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; typedef pair<long long,l...原创 2020-03-01 11:10:29 · 401 阅读 · 0 评论 -
算法导论学习笔记——7快速排序
7快速排序 ll Partition(ll A[],ll p,ll r) { x=A[r]; i=p-1; for(j=p;j<=r-1;j++) { if(A[j]<=x) { i++; swap(A[i],A[j]); } } swap(A[i+1],A[r]); return i+1; } 完整程序 #include<cstdi...原创 2020-03-01 10:17:03 · 360 阅读 · 0 评论 -
算法导论学习笔记——6堆排序
6堆排序 第一步:MaxHeapify 纯翻译代码 void MaxHeapify(ll A[],ll i) { l=left[i]; r=right[i]; if(l<=A.heapsize()&&A[l]>A[i]) largest=l; else largest=i; if(l<=A.heapsize()&&A[r]&...原创 2020-03-01 00:18:17 · 380 阅读 · 0 评论 -
算法导论学习笔记——5.1雇佣问题(未完待续)
5.1雇佣问题 这章内容未编辑完 因为概率论没学,所以真的看不懂这类概率期望的问题QAQ 等到学完后回来完善 纯翻译代码 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const int maxn=1000000; ll n,i,best,...原创 2020-02-22 17:37:09 · 471 阅读 · 0 评论 -
算法导论学习笔记——4.2矩阵乘法的Strassen算法
4.2矩阵乘法的Strassen算法 Strassen算法的时间复杂度为o(n^lg7), 我非常不推荐用此类方法解决矩阵乘法的问题, 下面的c++代码都是我以前整理的矩阵快速幂板子 是一种远远优于Strassen算法的算法 下面是矩阵乘法的伪代码 直接给出我以前整理过的模板 这边其实可以特判0来进行一个小优化 void cheng(ll a[][N],ll b[][N],ll n)//a=a*b...原创 2020-02-22 17:11:07 · 1163 阅读 · 1 评论 -
算法导论学习笔记——4.1最大子数组问题
4.1最大子数组问题 这类问题之前我都是用dp做的,通过刷新下标st与ed,来找到答案。 pst指的是可能的开头(possible start); 我的做法也是练习4.1-5的一个答案 pst=st=ed=1,maxsum=-inf,sum=0; for(i=1;i<=n;i++) { sum+=a[i]; if(sum>=maxsum) st=pst,ed=i,maxsum=su...原创 2020-02-22 16:11:38 · 444 阅读 · 0 评论 -
算法导论学习笔记——2.3.1分治法——习题2-4逆序对数
前两天做树状数组和线段树专题时碰到过 当时的做法如下 思路:从前往后读,读一个数x,让a[x]+=1,然后让ans+=∑(i=x+1…n)a[i],这个地方用线段树或者树状数组优化降低时间复杂度为lgn 再优化方法:离散化 时间复杂度o(nlgn) 学习了分治法后,发现分治法的时间复杂度也是o(nlgn) 当然这里也能用离散化优化 分治法代码 #include <bits/stdc++.h&...原创 2020-02-22 10:20:57 · 710 阅读 · 0 评论 -
算法导论学习笔记——2.3.1分治法(归并排序)
2.3.1分治 纯翻译代码 void merge(ll A[],ll p,ll q,ll r) { ll n1,n2; n1=q-p+1; n2=r-q; for(i=1;i<=n1;i++) L[i]=A[p+i-1]; for(j=1;j<=n2;j++) R[j]=A[q+j]; L[n1+1]=inf; R[n2+1]=inf; i=1; j=1; ...原创 2020-02-22 09:21:25 · 458 阅读 · 0 评论 -
算法导论学习笔记——2.1插入排序
2.1 插入排序 纯翻译代码 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const int maxn=1000000; ll n,A[maxn]; int main() { ll i,j,key; scanf("%lld",&...原创 2020-02-21 21:55:43 · 414 阅读 · 0 评论