算法(4th ed)(113):基础——数据抽象 4.8

阅读数:21 2019 年 11 月 2 日 12:27

算法(4th ed)(113):基础——数据抽象 4.8

(提高题)

1.2.15 文件输入。基于 Stringsplit() 方法实现 In 中的静态方法 readInts()

解答

复制代码
public static int[] readInts(String name)
{
In in = new In(name);
String input = in.readAll();
String[] words = input.split("\\s+");
int[] ints = new int[words.length];
for(int i = 0; i < word.length; i++)
ints[i] = Integer.parseInt(words[i]);
return ints;
}

我们会在 1.3 节中学习另一个不同的实现(请见 1.3.1.5 节)。

1.2.16 有理数。为有理数实现一个不可变数据类型 Rational,支持加减乘除操作。

public class Rational
              Rational(int numerator, int denominator)
   Rational   plus(Rational b)该数与 b 之和
   Rational   minus(Rational b)该数与 b 之差
   Rational   times(Rational b)该数与 b 之积
   Rational   divides(Rational b)该数与 b 之商
    boolean   equals(Rational that)该数与 that 相等吗
     String   toString()对象的字符串表示

无需测试溢出(请见练习 1.2.17),只需使用两个 long 型实例变量表示分子和分母来控制溢出的可能性。使用欧几里得算法来保证分子和分母没有公因子。编写一个测试用例检测你实现的所有方法。

1.2.17 有理数实现的健壮性。在Rational(请见练习 1.2.16)的开发中使用断言来防止溢出。

1.2.18 累加器的方差。以下代码为 Accumulator 类添加了 var()stddev() 方法,它们计算了 addDataValue() 方法的参数的方差和标准差,验证这段代码。

复制代码
public class Accumulator
{
private double m;
private double s;
private int N;
public void addDataValue(double x)
{
N++;
s = s + 1.0 * (N-1) / N * (x - m) * (x - m);
m = m + (x - m) / N;
}
public double mean()
{ return m; }
public double var()
{ return s/(N - 1); }
public double stddev()
{ return Math.sqrt(this.var()); }
}

与直接对所有数据的平方求和的方法相比较,这种实现能够更好地避免四舍五入产生的误差。

1.2.19 字符串解析。为你在练习 1.2.13 中实现的 Date 和 Transaction 类型编写能够解析字符串数据的构造函数。它接受一个 String 参数指定的初始值,格式如表 1.2.20 所示:

表 1.2.20 被解析的字符串的格式

类型 格式 举例
Date 由斜杠分隔的整数 5/22/1939
Transaction 客户、日期和金额,由空白字符分隔 Turing 5/22/1939 11.99

部分解答

复制代码
public Date(String date)
{
String[] fields = date.split("/");
month = Integer.parseInt(fields[0]);
day = Integer.parseInt(fields[1]);
year = Integer.parseInt(fields[2]);
}

评论

发布