没上学,没offer,准备把前段时间做的algorithms的编程作业和课回顾梳理一下,因为感觉网上的最后一个编程作业的博客比较少,所以决定从最后一个往前写
代码地址放最前面:https://github.com/RedemptionC/CourseraAlgorithms/tree/master/burrows
做编程作业,很重要的两个reference就是specification和faq(也就是原来的checklist),前者相当于一个需求说明和系统设计,后者给出了一些常见问题的解答,还有对于实现步骤的一些建议
FAQ https://coursera.cs.princeton.edu/algs4/assignments/burrows/faq.php
Specification https://coursera.cs.princeton.edu/algs4/assignments/burrows/specification.php
从spec可以了解到,我们要实现的是b-w压缩算法,这个算法有三个部分,burrows-wheeler transform,move to front,huffman encoding
其中需要我们实现的是第一二步
具体的实现步骤,我是参考的faq里给出的:
- 首先实现CircularSuffixArray(将会在burrows-wheeler transform的实现中用到),这个循环后缀数组大概是这样的:
比如原始数据为abcd,那么响应的循环后缀数组为
0 a b c d
1 b c d a
2 c d a b
3 d a b c
如上所示,得到这个数组我们似乎可以通过维护一个队列实现,每次出队,然后入队,就把原来队头元素放到了队尾
但是实际上,我们可以做的更加高效:我们可以通过保存每个循环后缀数组的开头元素在原始数据中的index,间接的保存整个数组的信息
这里需要强调一下做编程作业的要点,就是根据api编程,编程完成后你的代码会被autograder打分,所以你的代码必须符合给出的API,因此在编程之前必须先对API的要求熟记于心
public class CircularSuffixArray {
// circular suffix array of s
public CircularSuffixArray(String s)
// length of s
public int length()
// returns index of ith sorted suffix
public int index(int i)
// unit testing (required)
public static void main(String[] args)
}
这上面提到的index函数,要返回的是index of ith sorted suffix
i Original Suffixes Sorted Suffixes index[i]
-- ----------------------- ----------------------- --------
0 A B R A C A D A B R A ! ! A B R A C A D A B R A 11
1 B R A C A D A B R A ! A A ! A B R A C A D A B R 10
2 R A C A D A B R A ! A B A B R A ! A B R A C A D 7
3 A C A D A B R A ! A B R A B R A C A D A B R A ! 0
4 C A D A B R A ! A B R A A C A D A B R A ! A B R 3
5 A D A B R A ! A B R A C A D A B R A ! A B R A C 5
6 D A B R A ! A B R A C A B R A !