本打算周末完成这次作业,但没想到遇到了hard deadline,刚开始看不懂题意,后来发现算法4书上有个类似的问题,才理解了题意。最后晚上加班,上课加班,还好在11:35也就是课程结束前25分钟完成了这次作业。。。

本次作业学到的知识点:

1、java中两个类对象比较相等用equals,因此String对象也应用equals方法,而非“==”。

2、读取命令行参数用args[i],读取文件中的数据才用StdIn等。

3、String对象的长度用方法length,数组的长度用length()

4、类似于int在泛型中用Integer类,char在泛型中应用Charactor类。

5、用Arrays.sort方法对数组进行自定义排序,首先数组应为基本类型对应的类,然后要重载compare方法,这里参考别人的代码使用了匿名内部类,详见CircularSuffixArray类中构造函数。而对基本类型的数组排序,函数参数为数组名即可(见BurrowsWheeler类44行)。

作业中难以理解的一些地方:

1、后缀数组排序是指将每一行中的后缀字符数组看做字符串进行排序。

2、不需要讲后缀数组存储起来,因为如果字符数组在第n行,那么数组就以输入字符串中的第n个字符开始,从而根据输入字符串就可确定此字符数组。

3、BurrowsWheeler类的逆变换中,通过t数组构造一个<字符,字符在t数组中的下标的队列>的符号表,就可以方便的求出next数组。

 import java.util.List;
import java.util.ArrayList;
import edu.princeton.cs.algs4.BinaryStdIn;
import edu.princeton.cs.algs4.BinaryStdOut; public class MoveToFront {
// apply move-to-front encoding, reading from standard input and writing to standard output
public static void encode()
{
List<Character> list = new ArrayList<Character>();
for (int i = 0; i < 256; i++)
list.add((char)i);
while (!BinaryStdIn.isEmpty())
{
char c = BinaryStdIn.readChar();
int index = list.indexOf(c);
BinaryStdOut.write(index, 8);
list.remove(index);
list.add(0, c);
}
BinaryStdOut.close();
} // apply move-to-front decoding, reading from standard input and writing to standard output
public static void decode()
{
List<Character> list = new ArrayList<Character>();
for (int i = 0; i < 256; i++)
list.add((char)i);
while (!BinaryStdIn.isEmpty())
{
int index = BinaryStdIn.readChar();
char c = list.get(index);
BinaryStdOut.write(c);
list.remove(index);
list.add(0, c);
}
BinaryStdOut.close();
} // if args[0] is '-', apply move-to-front encoding
// if args[0] is '+', apply move-to-front decoding
public static void main(String[] args)
{
if (args[0].equals("-")) encode();
if (args[0].equals("+")) decode();
}
}
 import java.util.Arrays;
import java.util.Comparator; public class CircularSuffixArray {
private String input;
private Integer index[];
// circular suffix array of s
public CircularSuffixArray(String s)
{
if (s == null) throw new java.lang.IllegalArgumentException();
input = s;
index = new Integer[s.length()];
for (int i = 0; i < s.length(); i++)
index[i] = i;
Arrays.sort(index, new Comparator<Integer>() {
public int compare(Integer first, Integer second)
{
int p = first, q = second;
for (int i = 0; i < input.length(); i++)
{
if (p >= input.length()) p = 0;
if (q >= input.length()) q = 0;
if (input.charAt(p) > input.charAt(q)) return 1;
if (input.charAt(p) < input.charAt(q)) return -1;
p++;
q++;
}
return 0;
}
});
}
// length of s
public int length()
{
return index.length;
}
// returns index of ith sorted suffix
public int index(int i)
{
if (i < 0 || i > input.length() - 1)
throw new java.lang.IllegalArgumentException();
return index[i];
}
// unit testing (required)
public static void main(String[] args)
{
CircularSuffixArray csa = new CircularSuffixArray("ABRACADABRA!");
for (int i = 0; i < csa.length(); i++)
System.out.println(csa.index(i));
}
}
 import edu.princeton.cs.algs4.BinaryStdIn;
import edu.princeton.cs.algs4.BinaryStdOut;
import java.util.Arrays;
import edu.princeton.cs.algs4.Queue;
import edu.princeton.cs.algs4.ST; public class BurrowsWheeler {
// apply Burrows-Wheeler transform, reading from standard input and writing to standard output
public static void transform()
{
String input = BinaryStdIn.readString();
CircularSuffixArray csa = new CircularSuffixArray(input);
for (int i = 0; i < csa.length(); i++)
if (csa.index(i) == 0)
BinaryStdOut.write(i);
for (int i = 0; i < csa.length(); i++)
{
int index = csa.index(i) - 1;
if (index < 0) index = csa.length() - 1;
char c = input.charAt(index);
BinaryStdOut.write(c);
}
BinaryStdOut.close();
} // apply Burrows-Wheeler inverse transform, reading from standard input and writing to standard output
public static void inverseTransform()
{
int first = BinaryStdIn.readInt();
String chars = BinaryStdIn.readString();
char[] t = chars.toCharArray();
chars = null;
int i = 0, size = t.length;
ST<Character, Queue<Integer>> st = new ST<Character, Queue<Integer>>();
for (i = 0; i < size; i++)
{
if (st.contains(t[i])) st.get(t[i]).enqueue(i);
else {
Queue<Integer> q = new Queue<Integer>();
q.enqueue(i);
st.put(t[i], q);
}
}
Arrays.sort(t);
int next[] = new int[size];
for (i = 0; i < size; i++)
next[i] = st.get(t[i]).dequeue();
for (i = 0; i < size; i++)
{
BinaryStdOut.write(t[first]);
first = next[first];
}
BinaryStdOut.close();
} // if args[0] is '-', apply Burrows-Wheeler transform
// if args[0] is '+', apply Burrows-Wheeler inverse transform
public static void main(String[] args)
{
if (args[0].equals("-")) transform();
if (args[0].equals("+")) inverseTransform();
}
}

Coursera 算法二 week 5 BurrowsWheeler的更多相关文章

  1. Coursera 算法二 week2 Seam Carving

    这周作业设计到的算法是有向无环图的最短路径算法,只需要按照顶点的拓扑顺序去放松顶点即可.而在这个题目中拓扑顺序就是按照行的顺序或列的顺序. 用到的数据结构为一个二维数组picture同来存储每个像素的 ...

  2. Coursera 算法二 week 3 Baseball Elimination

    这周的作业不需要自己写算法,只需要调用库函数就行,但是有些难以理解,因此用了不少时间. import edu.princeton.cs.algs4.FlowEdge; import edu.princ ...

  3. Coursera 算法二 week 4 Boggle

    这次的作业主要用到了单词查找树和深度优先搜索. 1.在深度优先搜索中,在当前层的递归调用前,将marked数组标记为true.当递归调用返回到当前层时,应将marked数组标记为false.这样既可以 ...

  4. coursera 算法二 week 1 wordnet

    这周的作业可谓是一波三折,但是收获了不少,熟悉了广度优先搜索还有符号图的建立.此外还知道了Integer.MAX_VALUE. SAP: 求v和w的大概思路是对v和w分别广度优先搜索,然后遍历图中每一 ...

  5. TensorFlow 入门之手写识别(MNIST) softmax算法 二

    TensorFlow 入门之手写识别(MNIST) softmax算法 二 MNIST Fly softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  6. 分布式共识算法 (二) Paxos算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...

  7. Floyd算法(二)之 C++详解

    本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.c ...

  8. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  9. Prim算法(二)之 C++详解

    本章是普里姆算法的C++实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里姆算法的代码说明 4. 普里姆算法的源码 转载请注明出处:http://www.cnblogs.com/sk ...

随机推荐

  1. sqlplus 调试存储过程

    SQLPLUS里测试带返回参数的存储过程过程名p_test入参 aa varchar2出参 bb sys_refcursor 在SQLPLUS里如何将sys_refcursor 这个结果集获取出来呢 ...

  2. 使用jQuery实时监听input输入值的变化

    //jQuery实时监听input值变化 $("#email").on("input propertychange",function(){ var str = ...

  3. Scrum 冲刺博客第三篇

    一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 基本的页面设计 各个页面之间的跳转 背景音乐模块设计 今天计划完成的工作 ...

  4. ORCLE报错解决(ora-01747:无效的用户.表.列,表.列)

    原因: 这个问题出现是因为表中存在关键字造成.

  5. C语言位运算、移位运算 经典示例

    概述: C语言的位级运算可以运用到任何“整数”的数据类型上,如char.short.int.long.long long.或者unsigned这样的限定词.基本的位运算有与.或.非.异或等等. C语言 ...

  6. [转]Vue.js 目录结构

    本文转自:http://www.runoob.com/vue2/vue-directory-structure.html 上一章节中我们使用了 npm 安装项目,我们在 IDE(Eclipse.Ato ...

  7. 【转】IIS网站浏览时提示需要用户名密码登录-解决方法

    打开iis,站点右键----属性----目录安全性----编辑----允许匿名访问钩选 IIS连接127.0.0.1要输入用户名密码的解决办法原因很多,请尝试以下操作: 1.查看网站属性——文档看看启 ...

  8. DateReader读取数据

    DateReader对象提供了用循序的.只读的方式读取Command对象获取的数据结果集正是因为DateReader是以循序的方法连续地读取数据,所以DateReader会以独占的方式打开数据库连接. ...

  9. <深入理解JavaScript>学习笔记(3)_全面解析Module模式

    简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式. 首先我们来看看Module模式的基本特征: 模块化,可 ...

  10. Java编程基础知识总结大全(Ⅱ)

    7.类型转换 精度从高到低 double float long int short(char) byte (1)自动类型转换 将一个低精度---高精度 (2)强制类型转换 将一个高精度---低精度 ...