▶ 书中第三章部分程序,加上自己补充的代码,包含双向索引表、文建索引、稀疏向量类型

● 双向索引表

 package package01;

 import edu.princeton.cs.algs4.ST;
import edu.princeton.cs.algs4.Queue;
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut; public class class01
{
private class01() {} public static void main(String[] args)
{
String filename = args[0];
String separator = args[1];
In in = new In(filename); ST<String, Queue<String>> st = new ST<String, Queue<String>>();
ST<String, Queue<String>> ts = new ST<String, Queue<String>>(); // 反向索引 for(;in.hasNextLine();)
{
String line = in.readLine();
String[] fields = line.split(separator);
String key = fields[0];
for (int i = 1; i < fields.length; i++) // 一个 key 对应多个值,分别存放,以后可以根据值反向查找键
{
String val = fields[i];
if (!st.contains(key))
st.put(key, new Queue<String>());
if (!ts.contains(val))
ts.put(val, new Queue<String>());
st.get(key).enqueue(val);
ts.get(val).enqueue(key);
}
}
StdOut.println("Done indexing");
for(;!StdIn.isEmpty();) // 交互式查找,可以正向也可以反向
{
String query = StdIn.readLine();
if (st.contains(query))
{
for (String vals : st.get(query))
StdOut.println(" " + vals);
}
if (ts.contains(query))
{
for (String keys : ts.get(query))
StdOut.println(" " + keys);
}
}
}
}

● 文件索引

 package package01;

 import java.io.File;
import edu.princeton.cs.algs4.SET;
import edu.princeton.cs.algs4.ST;
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut; public class class01
{
private class01() {} public static void main(String[] args)
{
ST<String, SET<File>> st = new ST<String, SET<File>>();
StdOut.println("Indexing files");
for (String filename : args)
{
StdOut.println(" " + filename);
File file = new File(filename);
for(In in = new In(file);!in.isEmpty();)
{
String word = in.readString();
if (!st.contains(word))
st.put(word, new SET<File>());
SET<File> set = st.get(word);
set.add(file);
}
}
for(;StdIn.isEmpty();) // 交互式查找包含特定单词的文件
{
String query = StdIn.readString();
if (st.contains(query))
{
SET<File> set = st.get(query);
for (File file : set)
StdOut.println(" " + file.getName());
}
}
}
}

● 稀疏向量类型

 package package01;

 import edu.princeton.cs.algs4.ST;
import edu.princeton.cs.algs4.StdOut; public class class01
{
private int d; // 向量维数
private ST<Integer, Double> st; // 向量 index - value 对 public class01(int dim)
{
d = dim;
st = new ST<Integer, Double>();
} public void put(int i, double value)
{
if (i < 0 || i >= d)
throw new IllegalArgumentException("\n<put> i < 0 || i >= d.\n");
if (value == 0.0)
st.delete(i);
else
st.put(i, value);
} public double get(int i)
{
if (i < 0 || i >= d)
throw new IllegalArgumentException("\n<get> i < 0 || i >= d.\n");
return (st.contains(i)) ? st.get(i) : 0.0;
} public int nnz()
{
return st.size();
} @Deprecated
public int dimension() { return d; } public double dot(class01 that)
{
if (d != that.d)
throw new IllegalArgumentException("\n<dot> dimension disagree.\n");
double sum = 0.0;
if (st.size() <= that.st.size()) // 遍历元素较少的向量,去元素较多的向量中查找
{
for (int i : st.keys())
{
if (that.st.contains(i))
sum += get(i) * that.get(i);
}
}
else
{
for (int i : that.st.keys())
{
if (st.contains(i))
sum += get(i) * that.get(i);
}
}
return sum;
} public double dot(double[] that)
{
double sum = 0.0;
for (int i : st.keys())
sum += that[i] * get(i);
return sum;
} public double magnitude()
{
return Math.sqrt(dot(this));
} public class01 scale(double alpha)
{
class01 c = new class01(d);
for (int i : st.keys())
c.put(i, alpha * get(i));
return c;
} public class01 plus(class01 that)
{
if (d != that.d)
throw new IllegalArgumentException("\n<plus> dimension disagree.\n");
class01 c = new class01(d); // 新建一个向量存放结果
for (int i : st.keys())
c.put(i, get(i));
for (int i : that.st.keys())
c.put(i, that.get(i) + c.get(i));
return c;
} public String toString() // toString 接口
{
StringBuilder s = new StringBuilder();
for (int i : st.keys())
s.append("(" + i + ", " + st.get(i) + ") ");
return s.toString();
} public static void main(String[] args)
{
class01 a = new class01(10);
class01 b = new class01(10);
a.put(3, 0.50);
a.put(9, 0.75);
a.put(6, 0.11);
a.put(6, 0.00);
b.put(3, 0.60);
b.put(4, 0.90);
StdOut.println("a = " + a);
StdOut.println("b = " + b);
StdOut.println("a dot b = " + a.dot(b));
StdOut.println("a + b = " + a.plus(b));
}
}

《算法》第三章部分程序 part 6的更多相关文章

  1. 《算法》第三章部分程序 part 5

    ▶ 书中第三章部分程序,加上自己补充的代码,包含公共符号表.集合类型 ● 公共符号表,用于普通查找表的基本类 package package01; import java.util.NoSuchEle ...

  2. 《算法》第三章部分程序 part 4

    ▶ 书中第三章部分程序,加上自己补充的代码,包括散列表.线性探查表 ● 散列表 package package01; import edu.princeton.cs.algs4.Queue; impo ...

  3. 《算法》第三章部分程序 part 3

    ▶ 书中第三章部分程序,加上自己补充的代码,红黑树 ● 红黑树,大部分方法与注释与二叉树相同 package package01; import java.util.NoSuchElementExce ...

  4. 《算法》第三章部分程序 part 2

    ▶ 书中第三章部分程序,加上自己补充的代码,平衡二叉搜索树 ● 平衡二叉搜索树 package package01; import java.util.NoSuchElementException; ...

  5. 《算法》第三章部分程序 part 1

    ▶ 书中第三章部分程序,加上自己补充的代码,包括单词频率统计,(单链表)顺序查找表,二分查找表 ● 单词频率统计 package package01; import edu.princeton.cs. ...

  6. 《算法》第二章部分程序 part 3

    ▶ 书中第二章部分程序,加上自己补充的代码,包括各种优化的快排 package package01; import edu.princeton.cs.algs4.In; import edu.prin ...

  7. 《算法》第一章部分程序 part 1

    ▶ 书中第一章部分程序,加上自己补充的代码,包括若干种二分搜索,寻找图上连通分量数的两种算法 ● 代码,二分搜索 package package01; import java.util.Arrays; ...

  8. 《算法》第二章部分程序 part 5

    ▶ 书中第二章部分程序,加上自己补充的代码,包括利用优先队列进行多路归并和堆排序 ● 利用优先队列进行多路归并 package package01; import edu.princeton.cs.a ...

  9. 《算法》第二章部分程序 part 4

    ▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...

随机推荐

  1. linux在线中文手册

    linux在线中文手册 http://linux.51yip.com/ 百度中的百度应用也不错 http://www.baidu.com/s?word=linux%E5%91%BD%E4%BB%A4& ...

  2. pm2 常用命令

    pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的.它非常适合IaaS结构,但不要把它用于 ...

  3. CSS 鼠标选中文字后改变背景色的实现代码

    废话不多说,直接上代码 ::-moz-selection{background:#93C; color:#FCF;} ::selection {background:#93C; color:#FCF; ...

  4. ALGO-152_蓝桥杯_算法训练_8-2求完数

    记: 掌握完数的概念 AC代码: #include <stdio.h> int main(void) { int i,j,sum; ; i <= ; i ++) { sum = ; ...

  5. LeetCode——3. Longest Substring Without Repeating Characters

    一.题目链接:https://leetcode.com/problems/longest-substring-without-repeating-characters 二.题目大意: 给定一个字符串, ...

  6. AIX查询当前目录下各文件及目录大小

    AIX下要查询某个目录下各个文件或目录的占用空间大小 可以对du命令增加一个别名alias 放在~/.profile里 alias dus='du -sg ./* |sort' s表示文件和目录都是显 ...

  7. STL基础--迭代器和算法

    1 迭代器 Iterators 5种迭代器类型 随机访问迭代器: vector, deque, array // 允许的操作 vector<int> itr; itr = itr + 5; ...

  8. git撤销本地所有未提交的更改

    1. git clean -df2. git reset --hard第一个命令只删除所有untracked的文件,如果文件已经被tracked, 修改过的文件不会被回退.而第二个命令把tracked ...

  9. 【HTTP】使用 RestTemplete 实现 post请求

    如上图,要求: post请求; x-www-form-urlencoded 类型; 如下代码没有进行整理,但是测试OK package com.chinamobile.epic.http; impor ...

  10. Jenkins小试

    之前有提到和同事搭建了个Git+Gerrit+Jenkins环境,可惜都在一台机器上,中间IT重装系统后就杯具了,没有备份,只好重来. 6月份项目发布了首个Open API,那时候建了个api uni ...