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

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

● 双向索引表

 1 package package01;
 2
 3 import edu.princeton.cs.algs4.ST;
 4 import edu.princeton.cs.algs4.Queue;
 5 import edu.princeton.cs.algs4.In;
 6 import edu.princeton.cs.algs4.StdIn;
 7 import edu.princeton.cs.algs4.StdOut;
 8
 9 public class class01
10 {
11     private class01() {}
12
13     public static void main(String[] args)
14     {
15         String filename  = args[0];
16         String separator = args[1];
17         In in = new In(filename);
18
19         ST<String, Queue<String>> st = new ST<String, Queue<String>>();
20         ST<String, Queue<String>> ts = new ST<String, Queue<String>>(); // 反向索引
21
22         for(;in.hasNextLine();)
23         {
24             String line = in.readLine();
25             String[] fields = line.split(separator);
26             String key = fields[0];
27             for (int i = 1; i < fields.length; i++) // 一个 key 对应多个值,分别存放,以后可以根据值反向查找键
28             {
29                 String val = fields[i];
30                 if (!st.contains(key))
31                     st.put(key, new Queue<String>());
32                 if (!ts.contains(val))
33                     ts.put(val, new Queue<String>());
34                 st.get(key).enqueue(val);
35                 ts.get(val).enqueue(key);
36             }
37         }
38         StdOut.println("Done indexing");
39         for(;!StdIn.isEmpty();)                     // 交互式查找,可以正向也可以反向
40         {
41             String query = StdIn.readLine();
42             if (st.contains(query))
43             {
44                 for (String vals : st.get(query))
45                     StdOut.println("  " + vals);
46             }
47             if (ts.contains(query))
48             {
49                 for (String keys : ts.get(query))
50                     StdOut.println("  " + keys);
51             }
52         }
53     }
54 }

● 文件索引

 1 package package01;
 2
 3 import java.io.File;
 4 import edu.princeton.cs.algs4.SET;
 5 import edu.princeton.cs.algs4.ST;
 6 import edu.princeton.cs.algs4.In;
 7 import edu.princeton.cs.algs4.StdIn;
 8 import edu.princeton.cs.algs4.StdOut;
 9
10 public class class01
11 {
12     private class01() {}
13
14     public static void main(String[] args)
15     {
16         ST<String, SET<File>> st = new ST<String, SET<File>>();
17         StdOut.println("Indexing files");
18         for (String filename : args)
19         {
20             StdOut.println("  " + filename);
21             File file = new File(filename);
22             for(In in = new In(file);!in.isEmpty();)
23             {
24                 String word = in.readString();
25                 if (!st.contains(word))
26                     st.put(word, new SET<File>());
27                 SET<File> set = st.get(word);
28                 set.add(file);
29             }
30         }
31         for(;StdIn.isEmpty();)                  // 交互式查找包含特定单词的文件
32         {
33             String query = StdIn.readString();
34             if (st.contains(query))
35             {
36                 SET<File> set = st.get(query);
37                 for (File file : set)
38                     StdOut.println("  " + file.getName());
39             }
40         }
41     }
42 }

● 稀疏向量类型

  1 package package01;
  2
  3 import edu.princeton.cs.algs4.ST;
  4 import edu.princeton.cs.algs4.StdOut;
  5
  6 public class class01
  7 {
  8     private int d;                   // 向量维数
  9     private ST<Integer, Double> st;  // 向量 index - value 对
 10
 11     public class01(int d)
 12     {
 13         this.d = d;
 14         this.st = new ST<Integer, Double>();
 15     }
 16
 17     public void put(int i, double value)
 18     {
 19         if (i < 0 || i >= d)
 20             throw new IllegalArgumentException("\n<put> i < 0 || i >= d.\n");
 21         if (value == 0.0)
 22             st.delete(i);
 23         else
 24             st.put(i, value);
 25     }
 26
 27     public double get(int i)
 28     {
 29         if (i < 0 || i >= d)
 30             throw new IllegalArgumentException("\n<get> i < 0 || i >= d.\n");
 31         return (st.contains(i)) ? st.get(i) : 0.0;
 32     }
 33
 34     public int nnz()
 35     {
 36         return st.size();
 37     }
 38
 39     @Deprecated
 40     public int dimension() { return d; }
 41
 42     public double dot(class01 that)
 43     {
 44         if (this.d != that.d)
 45             throw new IllegalArgumentException("\n<dot> dimension disagree.\n");
 46         double sum = 0.0;
 47         if (this.st.size() <= that.st.size())       // 遍历元素较少的向量,去元素较多的向量中查找
 48         {
 49             for (int i : this.st.keys())
 50             {
 51                 if (that.st.contains(i))
 52                     sum += this.get(i) * that.get(i);
 53             }
 54         }
 55         else
 56         {
 57             for (int i : that.st.keys())
 58             {
 59                 if (this.st.contains(i))
 60                     sum += this.get(i) * that.get(i);
 61             }
 62         }
 63         return sum;
 64     }
 65
 66     public double dot(double[] that)
 67     {
 68         double sum = 0.0;
 69         for (int i : st.keys())
 70             sum += that[i] * this.get(i);
 71         return sum;
 72     }
 73
 74     public double magnitude()
 75     {
 76         return Math.sqrt(this.dot(this));
 77     }
 78
 79     public class01 scale(double alpha)
 80     {
 81         class01 c = new class01(d);
 82         for (int i : this.st.keys())
 83             c.put(i, alpha * this.get(i));
 84         return c;
 85     }
 86
 87     public class01 plus(class01 that)
 88     {
 89         if (this.d != that.d)
 90             throw new IllegalArgumentException("\n<plus> dimension disagree.\n");
 91         class01 c = new class01(d);                 // 新建一个向量存放结果
 92         for (int i : this.st.keys())
 93             c.put(i, this.get(i));
 94         for (int i : that.st.keys())
 95             c.put(i, that.get(i) + c.get(i));
 96         return c;
 97     }
 98
 99     public String toString()                        // toString 接口
100     {
101         StringBuilder s = new StringBuilder();
102         for (int i : st.keys())
103             s.append("(" + i + ", " + st.get(i) + ") ");
104         return s.toString();
105     }
106
107     public static void main(String[] args)
108     {
109         class01 a = new class01(10);
110         class01 b = new class01(10);
111         a.put(3, 0.50);
112         a.put(9, 0.75);
113         a.put(6, 0.11);
114         a.put(6, 0.00);
115         b.put(3, 0.60);
116         b.put(4, 0.90);
117         StdOut.println("a = " + a);
118         StdOut.println("b = " + b);
119         StdOut.println("a dot b = " + a.dot(b));
120         StdOut.println("a + b   = " + a.plus(b));
121     }
122 }

原文地址:https://www.cnblogs.com/cuancuancuanhao/p/9795441.html

时间: 2024-10-30 16:51:52

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

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

? 书中第三章部分程序,加上自己补充的代码,包含公共符号表.集合类型 ● 公共符号表,用于普通查找表的基本类 1 package package01; 2 3 import java.util.NoSuchElementException; 4 import java.util.TreeMap; 5 import edu.princeton.cs.algs4.StdIn; 6 import edu.princeton.cs.algs4.StdOut; 7 8 public class class

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

? 书中第三章部分程序,加上自己补充的代码,包括散列表.线性探查表 ● 散列表 1 package package01; 2 3 import edu.princeton.cs.algs4.Queue; 4 import edu.princeton.cs.algs4.SequentialSearchST; 5 import edu.princeton.cs.algs4.StdIn; 6 import edu.princeton.cs.algs4.StdOut; 7 8 public class

第三章—Windows程序

这一章我都不知道该如何写了,呵呵~~ 毕竟,Win32是一个非常深奥的系统,目前还容不得我这种 小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以,我也犯不着怕被人背后指着骂 本章的名字就叫<Windows程序>而不是<Windows程序设计>所以,我只是讲一些关于Windows程序运作的原理: Windows 为什么叫Windows,相信所有用过的朋友都可以明白,那桌面上一个一个的窗口,就是它名字的由来.也就是这一个又一个窗口

Python编程入门-第三章 编写程序 -学习笔记

第三章 编写程序 1.编辑源程序.运行程序 可通过IDLE中File>New File新建一个文本以编辑源程序,编辑完成可通过Run>Run Module(或者F5快捷键)来运行程序.Python源文件都以.py格式存储. 2.从命令行运行程序 除了上述利用IDLE的集成功能运行程序的方式外,当然也可以通过命令行运行程序,命令格式为:python ‘源文件名称.py’. 3.编译源代码 当运行py格式文件时,Python会自动创建相应的.pyc文件,该文件包含编译后的代码即目标代码,目标代码基

算法第三章上机实验

算法第三章上机实验 数字三角形 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. #include <iostream> using namespace std; int maxsum(int a[100][100],int n){ int b[100][100]={0}; for(int i=n-1;i>=0;i--){ for(int j=i;j>=0;j--){

揭露动态规划真面目——算法第三章上机实践报告

算法第三章上机实践报告 一.        实践题目 7-2 最大子段和 (40 分) 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5

《算法》第一章部分程序

? 书中第一章部分程序,加上自己补充的代码.包括若干种二分搜索和寻找图上连通分量数的两种算法. ● 代码,二分搜索 1 package package01; 2 3 import java.util.Arrays; 4 import edu.princeton.cs.algs4.StdRandom; 5 6 public class class01 7 { 8 public int binarySearch(int [] a, int target) // 非递归实现 9 { 10 int lp

算法第三章上机实践报告——动态规划

1.实践题目 7-1 数字三角形 (30 分) 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100. 接下来 n行是数字三角形各行中的数字.所有数字在0..99 之间. 输出格式: 输出最大路径的值. 输入样例: 在这里给出一组输入.例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6

第三章--Win32程序的执行单元(部分概念及代码讲解)(中-线程同步

学习<Windows程序设计>记录 概念贴士: 1. 同步可以保证在一个时间内只有一个线程对其共享资源有控制权.PS:共享资源包括全局变量.公共数据成员或者句柄等. 2. 临界区内核对象和时间内核对象可以很好地用于多线程同步和它们之间的通信. 3. 线程同步必要性:当多个线程在同一个进程中执行时,可能有不止一个线程同时执行同一段代码,访问同一段内存中的数据.多个线程同时读取共享数据没有问题,但是如果同时读写,情况就不同,也许会产生极大的错误.(如:程序CountErr).解决同步问题,就是保证