《算法》第三章部分程序 part 6
▶ 书中第三章部分程序,加上自己补充的代码,包含双向索引表、文建索引、稀疏向量类型
● 双向索引表
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的更多相关文章
- 《算法》第三章部分程序 part 5
▶ 书中第三章部分程序,加上自己补充的代码,包含公共符号表.集合类型 ● 公共符号表,用于普通查找表的基本类 package package01; import java.util.NoSuchEle ...
- 《算法》第三章部分程序 part 4
▶ 书中第三章部分程序,加上自己补充的代码,包括散列表.线性探查表 ● 散列表 package package01; import edu.princeton.cs.algs4.Queue; impo ...
- 《算法》第三章部分程序 part 3
▶ 书中第三章部分程序,加上自己补充的代码,红黑树 ● 红黑树,大部分方法与注释与二叉树相同 package package01; import java.util.NoSuchElementExce ...
- 《算法》第三章部分程序 part 2
▶ 书中第三章部分程序,加上自己补充的代码,平衡二叉搜索树 ● 平衡二叉搜索树 package package01; import java.util.NoSuchElementException; ...
- 《算法》第三章部分程序 part 1
▶ 书中第三章部分程序,加上自己补充的代码,包括单词频率统计,(单链表)顺序查找表,二分查找表 ● 单词频率统计 package package01; import edu.princeton.cs. ...
- 《算法》第二章部分程序 part 3
▶ 书中第二章部分程序,加上自己补充的代码,包括各种优化的快排 package package01; import edu.princeton.cs.algs4.In; import edu.prin ...
- 《算法》第一章部分程序 part 1
▶ 书中第一章部分程序,加上自己补充的代码,包括若干种二分搜索,寻找图上连通分量数的两种算法 ● 代码,二分搜索 package package01; import java.util.Arrays; ...
- 《算法》第二章部分程序 part 5
▶ 书中第二章部分程序,加上自己补充的代码,包括利用优先队列进行多路归并和堆排序 ● 利用优先队列进行多路归并 package package01; import edu.princeton.cs.a ...
- 《算法》第二章部分程序 part 4
▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...
随机推荐
- backgroud 应用减小资源大小和请求数
一,一个典型的应用,利用小图的自动延伸,实现整个网页背景图,充分节约资源宽带.如:汽车之家的404页背景图就是这样 <div style="height: 3000px; backgr ...
- sqlalchemy 或者pysql 连接数据库时支持中文操作
参数后面带上?charset=utf8就行 engine = create_engine("mysql+pymysql://hrg:123@192.168.80.200:3306/test? ...
- Linux系统构成和基本操作
Linux的优势 Linux的目录结构 Linux目录与文件管理 列出目录内容 创建新目录(文件夹) 创建文件 复制文件或目录 删除文件或目录 移动目录或文件 查看文件属性 文件属性含义 读权限-4 ...
- 恢复word中审阅选项卡
碰到在Word中,使用自定义功能区添加审阅选项卡,仍然不显示审阅选项卡 二个办法: 1.检查COM加载项,找出并从此禁用,如:iWebOffice2009.ocx 2.创建自定选项卡“审阅(自定义)” ...
- 死磕!Windows下Apache+PHP+phpmyadmin的配置
环境配置真的很烦很费时间,稍不小心就会出错,这是一个鸡肋体力劳动,耐心和忍耐少不了.这个资料已经非常详细了,其中变量和路径不是百分百吻合但是意思已经很清楚了.剩下的就是耐心的执行和琢磨了. 一. A ...
- MySQL binlog 组提交与 XA(两阶段提交)--1
参考了网上几篇比较靠谱的文章 http://www.linuxidc.com/Linux/2015-11/124942.htm http://blog.csdn.net/woqutechteam/ar ...
- PHP中的static的理解
静态方法 (1)静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性: (2)从当前类(不是子类)中访问静态方法或属性,可以使用 self 关键字,self 指向当前类,就 ...
- [UE4]模拟网络延迟和丢包
进入游戏界面,按下键盘的“~”键,打开控制台界面,输入net会自动列出跟网络相关的命令 1.Net pktLag=,模拟延迟,单位是毫秒 2.Net PktLagVariance=300,在模拟延迟的 ...
- [UE4]蓝图使用GameMode重构
GameMode的生命周期贯穿整个游戏,当然也包括各个关卡.因此可以把各个关卡都需要的功能放置在GameMode,以达到功能共享.重复利用的目的!
- linux下软件安装知识整理
一.软件包安装分类源码包二进制包(RPM包,系统默认包)源码包优点1.开源 可以自由选择所需的功能 软件是编译安装,适合自己系统,更加稳定,效率更高 卸载方便 缺点 安装过程步骤较多,容易 ...