普林斯顿算法课Part2第五周作业_Burrows

作业地址: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;
        }
原文地址:https://www.cnblogs.com/notTao/p/6411631.html