Coursera 算法二 week 5 BurrowsWheeler
本打算周末完成这次作业,但没想到遇到了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的更多相关文章
- Coursera 算法二 week2 Seam Carving
这周作业设计到的算法是有向无环图的最短路径算法,只需要按照顶点的拓扑顺序去放松顶点即可.而在这个题目中拓扑顺序就是按照行的顺序或列的顺序. 用到的数据结构为一个二维数组picture同来存储每个像素的 ...
- Coursera 算法二 week 3 Baseball Elimination
这周的作业不需要自己写算法,只需要调用库函数就行,但是有些难以理解,因此用了不少时间. import edu.princeton.cs.algs4.FlowEdge; import edu.princ ...
- Coursera 算法二 week 4 Boggle
这次的作业主要用到了单词查找树和深度优先搜索. 1.在深度优先搜索中,在当前层的递归调用前,将marked数组标记为true.当递归调用返回到当前层时,应将marked数组标记为false.这样既可以 ...
- coursera 算法二 week 1 wordnet
这周的作业可谓是一波三折,但是收获了不少,熟悉了广度优先搜索还有符号图的建立.此外还知道了Integer.MAX_VALUE. SAP: 求v和w的大概思路是对v和w分别广度优先搜索,然后遍历图中每一 ...
- TensorFlow 入门之手写识别(MNIST) softmax算法 二
TensorFlow 入门之手写识别(MNIST) softmax算法 二 MNIST Fly softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...
- 分布式共识算法 (二) Paxos算法
系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...
- Floyd算法(二)之 C++详解
本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.c ...
- Dijkstra算法(二)之 C++详解
本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...
- Prim算法(二)之 C++详解
本章是普里姆算法的C++实现. 目录 1. 普里姆算法介绍 2. 普里姆算法图解 3. 普里姆算法的代码说明 4. 普里姆算法的源码 转载请注明出处:http://www.cnblogs.com/sk ...
随机推荐
- android的计算器
今天我闲着无聊,便想仿照Iphone的计算器自己写一个出来玩玩,于是就开动脑经,来场头脑风暴了!我拿什么了写呢?wp?这是个不错的选择,但是我最近在研究安卓的开发(求各位MSP不要烧我,我买不起MAC ...
- Android四大组件--服务(Service)
1. startService和bindService的区别 1. startService: 生命周期: onCreate---onStartCommand---onDestory 与服务的通讯: ...
- CSS级联样式表-css选择器
CSS概念 Cascading Style sheet 级联样式表 表现HTMl或XHTML文件样式的计算机语言 包括对字体,颜色,边距,高度,宽度,背景图片,网页定位等设定 建议:把表示样式的代码从 ...
- Dapper的简单使用(初学者归纳)
Dapper的简单使用(初学者归纳) //引用:using System;using System.Collections.Generic;using System.Linq;using System ...
- php and js to facebook登陆 最佳实践
Facebook Login Flow & Best Practices Best practice for Facebook login flow with the JavaScript S ...
- 06-码蚁JavaWeb之Servlet生命周期与基本配置
学习地址:[撩课-JavaWeb系列1之基础语法-前端基础][撩课-JavaWeb系列2之XML][撩课-JavaWeb系列3之MySQL][撩课-JavaWeb系列4之JDBC][撩课-JavaWe ...
- 非法关闭idea后报错,插件无法正常加载解决方法
Problems found loading plugins: Plugin "GlassFish Integration" was not loaded: required pl ...
- jenkins 分布式部署
一 什么是Jenkins的分布式构建和部署 Jenkins的分布式构建,在Jenkins的配置中叫做节点,分布式构建能够让同一套代码或项目在不同的环境(如:Windows7\winxp和Linux系统 ...
- Angular中EventEmitter不是泛型类型
今天在做angular发射数据时,报错:EventEmitter不是泛型类型, 当时第一点就想到是不是没有引入,一看引入了 后面看api文档发现引入错了,其实是引入下面的 可能是之前快捷输入时,IDE ...
- JavaScript自定义字符串格式化
在JS中没有字符串拼接的方法,如过要使用怎么办呢?这时我们可以通过字符串的prototype可以自定义方法. <script> String.prototype.format = func ...