Algorithms 第4版 by Sedgewick 笔记

官方网站 http://algs4.cs.princeton.edu/home/

1.3.1算术表达式求值的双栈算法

(Arithmetic expression evaluation) 要求所有的运算都加上括号。通过两个栈,一个保存运算符,一个保存操作数。遇到运算符或操作数的时候入栈,遇到右括号的时候弹出两个操作数和一个运算符。算法是Dijkstra发明的。代码见http://algs4.cs.princeton.edu/13stacks/Evaluate.java.html

2.4.4索引优先队列

(Index priority queue) 队列中的元素来自数组的一部分,能够获取最小元素的下标,还能够根据下标从优先队列中找到该元素,或者修改元素。应用:多路归并,每次取出最小元素后,根据最小元素的下标(即来自哪一路),从该路读取下一个元素。代码http://algs4.cs.princeton.edu/24pq/IndexMaxPQ.java.html 或见习题2.4.33。思路是通过两个辅助数组在堆内部索引和元素索引之间进行变换。

3.3平衡查找树

关于红黑树最好的讲解,http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf

4.4.5并行任务调度

(Parallel job scheduling) 普通的任务调度问题:n个任务,之间存在依赖关系,要求安排任务的顺序使得满足依赖关系。解法:拓扑排序。并行任务调度:假设存在足够多的cpu,找出能够完成任务的最短时间。解:对每个任务分配两个顶点,一个顶点代表任务的开始,一个代表结束,开始到结束之间的边长表示该任务需要的时间。若任务B依赖A,则从A的结束顶点到B的开始顶点有边长为0的边。另外添加一个起始顶点s,通过边长为0的边指向所有任务的开始顶点;以及一个结束顶点t,由所有任务的结束顶点指向t。则从s到t的最短路径意味着完成所有任务需要的最小时间。

4.4.5带最后期限限制的并行任务调度

(Parallel job scheduling with relative deadlines)相对期限是指任务B必须在A开始后的若干小时内开始,或者A的开始时间不能早于B若干小时。解法:在并行任务调度的解法上添加如下边,如果B必须在A开始后的d时间内开始,则添加B指向A的长度为-d的边。然后将所有边的权重取反。如果存在负环,则调度不可行。(取反后限制边权重为正,普通边权重为负,负环意味着该路径上任务的总时间超出了时间限制)

5.3字符串查找算法

KMP算法:设长串当前指针为i,模式串指针为j,当i和j的字符不匹配时,将模式串往右移,使得i永远不需要回退。根据i和j处的字符,决定模式串右移多少(即i+1和哪个新的j进行比较),通过DFA实现。

Boyer-Moore算法:模式串是从右向左扫描,根据长串不匹配位置(i)上的字符,决定将模式串右移多少。举例如下:

FINDINAHAYSTACKNEEDLE
NEEDLE
     NEEDLE

Rabin-Karp指纹查找:长度为m的模式串算一个hash值,长串里的每个m字串算出hash值。关键在与hash算法,在长串里面移动时,只需根据窗口里新增的字符和消失的字符,就能算出hash值。

5.4正则表达式与NFA

判断一个长度为M的正则表达式所对应的NFA能否识别一段长度为N的文本所需要的最坏时间为MN。和字串查找的暴力解法是相同的。

5.5.6LZW压缩

优点是不需要事先扫描字符串,也不需要附加额外的编译表,编译表是在解码过程中自然得到的。思路是,不仅编码单个字符,还编码短串,代价是单个编码使用的位数多一些(比如用12位编码8位的字符集)。编码过程:(1)找出未处理的输入在符号表中的最长前缀s (2)数出s的编码值 (3)扫描s之后的下一个字符c (4)将s+c添加进符号表。

6.0.1事件驱动模拟

比如粒子碰撞系统。用优先队列保存事件(1)取出即将发生的事件 (2)如果事件无效,忽略 (3)按照直线运动使所有粒子运动到时刻t (4)更新所有擦怒碰撞的粒子速度 (5)预测参与碰撞的粒子在未来可能发生的碰撞,加入优先队列。

6.0.3最长重复子串问题

"to be or not to be"的最长重复子串为"to be"。解法:生成所有从位置i到结尾的子串(可以像jdk6一样,并不实际存储这些子串,只记录起止位置),将子串排序,比较相邻的子串即可。

6.0.5问题归约

最大流问题和最短路径问题都可以归约为线性规划。最大流的归约容易证明,最短路径该怎么证呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值