《算法》第三章部分程序 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 ...
随机推荐
- Python3中Urllib库基本使用
什么是Urllib? Python内置的HTTP请求库 urllib.request 请求模块 urllib.error 异常处理模块 urllib.par ...
- InfluxDB v1.6.4 下载
InfluxDB v1.6.4 OS X (via Homebrew) brew update brew install influxdb Docker Image docker pull influ ...
- python基本知识点
1.基本数据类型 1.1int 字符串转换为数字,比如 a = “123” print(type(a) , a) b = int(a) print(type(b),b) num = “b” v = i ...
- Azure SQL Database (22) Azure SQL Database支持中文值
<Windows Azure Platform 系列文章目录> 在笔者之前的文章里,已经介绍了如何使Azure SQL Database支持中文: SQL Azure(七) 在SQL Az ...
- spring boot 热更新配置
maven添加 spring-boot-devtools 允许自动构建 设置里面,搜索compiler,在Build,Execution,Deployment里面勾选Build project aut ...
- VC禁止或允许拖拽改变窗口尺寸
创建窗口时用WS_THICKFRAME控制 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CMDIFrameWndEx:: ...
- 详细记录sql运行时间(精确到毫秒)
写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务器的响应时间有多快,这个时候就需要用到SQL的STATISTICS状态值来查看了. 通过设置STATISTICS我们可以查看执行SQL时的 ...
- Git将本地库内容推送到远程
本地库与远程库的交互 1 .将本地库的内容推送到远程库 A.创建一个本地仓库 $ mkdir gitdemo B.初始化本地仓库 $ git init C.项目根目录下创建 .gitignore 文件 ...
- windows下python2和python3同时安装ipython
1.ipython简介: IPython 是一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许 ...
- 迭代器和增强for
增强for 内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作. 格式: for(元素的数据类型 变量 : Collection集合or数组){ } 它用于遍 ...