Coursera Algorithm Ⅱ week5 编程作业 Burrows-wheeler

本文介绍了Coursera算法课程中关于Burrows-Wheeler变换的编程作业,包括CircularSuffixArray的实现、BWT正逆变换及Move To Front编码。通过分析specification和FAQ,阐述了如何利用循环后缀数组进行排序,计算first和next数组,以及在线性时间内完成逆变换的方法。
摘要由CSDN通过智能技术生成

没上学,没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里给出的:

  1. 首先实现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 !

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值