作业地址:http://coursera.cs.princeton.edu/algs4/assignments/burrows.html
作业难点:
1、理解题意:
1)完成bzip2压缩算法三步骤中的:BW转换(Burrows-Wheeler transform)、MTF编码(Move-to-front encoding)以及BW转换的辅助类—循环后缀串类(Circular suffix array)。
2)理解BW转换解码的工作机制:
i Sorted Suffixes t next -- ----------------------- ---- 0 ! ? ? ? ? ? ? ? ? ? ? A 3 1 A ? ? ? ? ? ? ? ? ? ? R 0 2 A ? ? ? ? ? ? ? ? ? ? D 6 *3 A ? ? ? ? ? ? ? ? ? ? ! 7 4 A ? ? ? ? ? ? ? ? ? ? R 8 5 A ? ? ? ? ? ? ? ? ? ? C 9 6 B ? ? ? ? ? ? ? ? ? ? A 10 7 B ? ? ? ? ? ? ? ? ? ? A 11 8 C ? ? ? ? ? ? ? ? ? ? A 5 9 D ? ? ? ? ? ? ? ? ? ? A 2 10 R ? ? ? ? ? ? ? ? ? ? B 1 11 R ? ? ? ? ? ? ? ? ? ? B 4
a) If sorted row i and j both start with the same character and i < j, then next[i] < next[j]. 对于排序好的字符串,字母相同时,下标小的,在待解码串中的位置也靠在前面。(如上图示)
b) 依据作业提示,参考键索引计数排序算法,即可构建求解next[i]的算法。
c) 如何根据next[i]解码:观察上图第3行和第7行,可发现ROW[3][0] == ROW[7][11],亦即解码字符为待解码串的第next[i]个字符,遍历全部next[i]可解码出原字符串。
2、如何保证循环后缀串类排序的性能:
1)如果直接使用库中的排序算法构建循环后缀串求解next[i],提交后会爆内存溢出错误,且不能满足性能需求。
2)数据压缩算法压缩的文件很大,同时待排序的字符串为循环串,利用循环串的特性,可以不显示构造其他串,直接通过下标来区分所有字符串。
3)分别通过Merge、Quick3way、MSD、Quick3String对循环后缀串进行排序,前三个算法均不能满足作业的性能需求。
容易扣分点:
同作业难点。
部分代码:
1、Quick3String的字符串比较算法:
private static boolean less(int[] a, int i, int j, int d, String s) { int p = a[i], q = a[j], n = s.length(); char prior, back; for (int k = d; k < n; k++) { prior = s.charAt((p+k)%n); back = s.charAt((q+k)%n); if (prior < back) return true; if (prior > back) return false; } return false; }