算法总结.docx
- 文档编号:30421140
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:63
- 大小:37.41KB
算法总结.docx
《算法总结.docx》由会员分享,可在线阅读,更多相关《算法总结.docx(63页珍藏版)》请在冰豆网上搜索。
算法总结
算法总结
VerBeta0.9999945
2008-10-29
编者:
SLL
目录
一、字符串处理
二、排序算法
三、高精度
四、搜索模型
五、树&图论算法
1、树的储存结构
2、树的最小公共祖先(LCA)
3、树遍历
4、多叉转二叉
5、最优二叉树(哈夫曼树)
6、二叉查找树(BST)
7、单词查找树(Trie)
8、树的直径
9、图的储存结构
10、图的遍历
11、图的强连通分量
12、图的关节点
13、图的最小生成树
14、图的最短路经
15、图的最小环
16、拓扑排序&关键路径
五、数学知识
1、其他图论
2、排列组合
3、数论
4、一阶二阶常系数线性齐次差分方程解法
5、博弈论
六、动态规划
七、其他
1、并查集
八、NOIP用不到的…//未完成…
1、二叉平衡查找树
2、线段树
3、网络流
4、计算几何——不会
九、后记——与NOIP无关
一、字符串处理回目录
1、Pascal语言常用字符串函数及过程
FuncLength(s);
ProcStr(a,s);
ProcVal(s,k,code);
ProcInsert(s1,s2,position);
ProcDelete(s,I,num);
FuncPos(s1,s2);
Funccopy(s,I,num)
2、字符串匹配//笔记Frommyblog,感谢LMF大牛讲解,OrzMatrix67
(1)朴素:
【O(mn)】
(2)RK算法【时间大概O(n+m)】
若全为数字,可以把模式串转为数字,再在目标串中寻找相同长度的数字进行比较
改进:
当m过大时,可以对模式串模上一个适当的数(多取较大的质数)[用O(m)的时间求模],再对目标串上的相同长度且模后相同的数字进行比较,找出匹配。
【如何较快的对目标串(设为t)进行模?
先求第一个长度m的数字(设为b1,长度为5)模d的结果,设为r1。
当求第2到6个数字(b2)时,b2modd=((b1-t[1]*10^4)*10+t6)modd】
例:
在一个长度为n的字母串S中,求最长的公共子串的长度。
解决:
因为对于最大的长度m,任何比其小的长度均有一对公共子串。
因此对总长度进行二分,用RK算法(把字母变为数字),创建hash表,在用链表处理hash表冲突时,若找到有两个相同的值,即认为有这样的一对公共子串,则在其之下的长度均可达到,把最大值记为m,再二分枚举上半部分,否则二分枚举下半部分。
[或可以记录可能达到与不可能达到的上下界(处置设为:
可达(-无穷,0),不可达(n,+无穷),当上=下时即为所求)
(3)有限状态自动机【不理解】
自动机:
可以看成图,顶点为有一定意义的状态,边为状态转移,有一个初始状态,通过对其进行输入,会从当前状态转化到另一状态。
思想:
建立自动机:
状态q表示目标串中从头开始的某子串的后缀和模式串S的前缀的最大匹配长度为q;若从第1个开始的子串t为状态q,则子串[t+'?
'(?
为一个字符)]最大能够匹配q+1位,实际上时求模式串S的Sq+'a'的后缀与模式串S的前缀能匹配的最大长度(先行初始化求状态转移,时间O(m^2))。
初始状态为0,通过不断把目标串的字符喂入自动机进行转移,当第i次转移后到达状态模式串的长度即完成匹配一次。
(4)、KMP算法【时间复杂度O(m+n)】
思想:
在匹配过程中,当长度位m的模式串S的i+1位与长度为n的目标串T第j+1位失配时,尝试找到一个最大的k(k
当找到后,令模式串S从目标串的第j-k位再开始进行匹配。
如何进行初始化?
思想:
若Si的后k位与S的前k位匹配,则Si-1的后k-1位与S的前k-1位相匹配。
方法:
p[i]=p[i-1]+1(s[i]=s[p[i-1]+1])否则尝试p[p[i-1]]+1(若还不行则p[p[p[i-1]]]+1...不断迭代)
注意:
最终前i为中所有满足条件的k为(p[i],p[p[i]],p[p[p[i]]]...直到s[i+1]=t[i+1])
核心过程:
//FromM67’sBlogorz….
//初始化求p[i](实际上是对模式串本身进行一次匹配)
P[1]:
=0;
j:
=0;
fori:
=2tomdo
begin
while(j>0)and(s[j+1]<>s[i])doj:
=P[j];//不断迭代直到找到s[j+1]=s[i]或达到0
ifs[j+1]=s[i]thenj:
=j+1;
P[i]:
=j;
end;
//KMP算法
j:
=0;
fori:
=1tondo
begin
while(j>0)and(s[j+1]<>t[i])doj:
=P[j];
ifs[j+1]=t[i]thenj:
=j+1;
ifj=mthen
begin
writeln('Patternoccurswithshift',i-m);
j:
=P[j];
end;
end;
【对此不理解请参阅Matrix67’sblog中的详细解释】
3、关于表达式的问题种种【不写了…】
(1)缀制转换【利用双栈处理】
(2)表达式求值【利用栈或者先转后缀】
二、排序算法回目录
1、插入排序【大约O(n^2)】
思想:
将数字插入有序数组,使之成为新数组
核心过程:
[a为原数组,num为结果数组]
Procedureinsertion_sort;
Var
i,j,k:
longint;
Begin
fori:
=1ton+1donum[i]:
=maxint;
num[1]:
=a[1];
ForI:
=2tondobegin
ForJ:
=1toIdo
Ifnum[j]>a[I]thenbreak;
ForK:
=j+1toido
Num[k]:
=num[k-1];
Num[j]:
=a[I];
End;
End;
优化:
使用二分查找,或使用链表实现
【附:
非减小数组中数的二分检索过程】
FunctionFind(Value,L,R):
integer;//在[L..R]中查找Value,返回位置
Begin
Mid:
=(L+R)div2;
Ifa[Mid]=ValuethenExit(Mid);
Ifa[Mid]>ValuethenExit(Find(Value,L,Mid-1));
Ifa[Mid] End; 2、选择排序【大约O(n^2)】 思想: 每次选择最小的元素与当前待排数组队头交换 核心过程: Procedureselection_sort; Var i,j,k: longint; Begin ForI: =1tondobegin K: =I; ForJ: =I+1tondo Ifa[K]>a[J]thenK: =J; Swap(a[I],a[K]); End; End; 3、冒泡排序【大约O(n^2)】 思想: 每次比较邻近的两个数 核心过程: ProcedureBubble_sort; Var i,j: longint; Begin ForI: =1tondo ForJ: =ndowntoI+1do Ifa[J-1]>a[J]thenSwap(a[J-1],a[J]); End; 4、快速排序【大约O(nlgn)~O(n^2)】 思想: 分治排序 核心过程 Procedurequick_sort(l,r: integer); Var i,j,mid: longint; Begin I: =l;J: =r;Mid: =a[(l+r)div2]; Repeat Whilea[I] Whilea[J]>Middodec(J); IfI<=Jthenbegin Swap(a[I],a[J]); Inc(I);Dec(J); End; UntilI>J; IfI IfJ>lthenquick_sort(l,J); End; 拓展: 利用快排思想的快速选择算法【不想写了,详见NOIP2008提高组初赛完善程序第一题】 5、堆排序【大约O(nlgn)】 思想: 不断维护一个堆的性质 核心过程: [a为原数组,num为结果数组] Proceduresift(I,m: integer); Var j,value: longint; Begin J: =I*2; Value: =a[I]; WhileJ<=mdobegin If(J =J+1; IfValue>a[J]thenbegin a[I]: =a[J]; I: =J; J: =2*I; EndelseBreak; A[I]: =Value; End; End; ProcedureMake_heap; Var i: longint; Begin ForI: =ndiv2downto1do Sift(I,n); End; ProcedureHeap_sort; Var i: longint; Begin Make_heap; ForI: =1tondobegin Num[I]: =a[1]; Swap(a[1],a[n]); Dec(n); Sift(1,n); End; End; 6、归并排序【O(nlgn)】 思想: 合并两个有序数列为一个 核心过程: [a为原数组,num为临时数组] ProcedureMerge(l,Mid,r: integer); Var i,j,k,kk: longint; Begin I: =l; J: =Mid+1; Fork: =ltordobegin IfI>Midthenbegin Forkk: =ktordobegin Num[kk]: =a[J]; Inc(j); end; break; End; IfJ>rthenbegin Forkk: =ktordobegin Num[kk]: =a[I]; Inc(I); end; break; End;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 总结