《算法》第三章部分程序 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 ...
随机推荐
- DynArrayToVariant DynArrayFromVariant复制动态数
type intArr=array of Integer; procedure TfrmMainDA.Button2Click(Sender: TObject);var aa:intArr;bb:in ...
- linux 内存映射-ioremap和mmap函数
最近开始学习Linux驱动程序,将内存映射和ioremap,mmap函数相关资料进行了整理 一,内存映射 对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器 ...
- Ubuntu PPA软件源
PPA,其英文全称为 Personal Package Archives,即个人软件包档案.是 Ubuntu Launchpad 网站提供的一项源服务,允许个人用户上传软件源代码,通过 Launchp ...
- git log乱码显示
1.Linux下UTF8编码 [xusi@pre-srv24 crm2]$ localeLANG=en_US.UTF-8 设置如下: git config --global i18n.commiten ...
- Qt QDateTime QTimer的简单实用
转载:N3verL4nd qttimer.h #ifndef QTTIMER_H #define QTTIMER_H #include <QDialog> namespace Ui { c ...
- Ubuntu 14.10 下安装Spark
Spark 是一种与 Hadoop 相似的开源集群计算环境,不过最近非常火.下面介绍安装步骤. 1 安装scala 1.1 我选用的是2.11.4,下载地址http://www.scala-lang. ...
- web环境中微信JS-SDK配置
一.公众号相关设置 首先,在公众号中进行JS安全域名的设置,在公众号设置-功能设置中选择JS接口安全域名,点击设置进入设置对话框.按照要求逐步进行,完成设置. 二.页面请求发送与处理 引入所需js: ...
- python selenium 模拟登陆百度账号
代码: from selenium import webdriver url = 'https://passport.baidu.com/v2/?login' username = 'your_use ...
- R语言 实验三 数据探索和预处理
计算缺失值个数 计算缺失率 简单统计量:计算最值 箱形图分析 分布分析:画出频率直方图 统计量分析:对于连续属性值,求出均值以及标准差 缺失值处理:删除法 去除 ...
- public class的类名必须跟文件名保持一致吗?