背包是一种不支持从中删除元素的的集合数据类型----它的目的就是帮助用例收集元素并迭代遍历所有收集到的元素。
例如:
计算标准输入中的所有Double的值的平均值和样本标准差。
如果标准输入中有N个数组,那么平均值为他们的和除以N
样本标准差:每个值和平均值之差的平方和除以N-1之后的平方根
package base.第一章.背包_队列_和栈.背包;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* Created by MK on 2018/7/17.
* 背包是一种不支持从中删除元素的的集合数据类型----它的目的就是帮助用例收集元素并迭代遍历所有收集到的元素。
*/
public class Bag<Item> implements Iterable<Item> {
private Node<Item> first; //链表的首节点
private int n;
private static class Node<Item> {
//定义了节点(Node)的嵌套类
private Item item; //item则是所传入的值
private Node<Item> next; //next代表的是指针
}
//构造方法
Bag() {
first = null; //创建头节点
n = 0;
}
public boolean isEmpty() {
return first == null;
}
int size() {
return n;
}
void add(Item item) {
//这里的添加并没有注重顺序(指针指向的只是我的老节点),因为对于背包来讲顺序并不重要
/**
* 类似于,我往背包中逐次放入一个一个的弹球,每放入一个新的弹球则我前一个弹球的指针,指定的就是我新弹球的地址。
* 对于我第一次放的弹球,因为其没有弹球地址可指定,因此指定的是null
* */
Node<Item> oldfirst = first; //此时的first就是头节点,此时的头节点就变成了老节点
first = new Node<Item>(); //创建一个新节点
first.item = item; //将传来的数据赋值给新节点值
first.next = oldfirst;//将新节点的指针指向老节点
n++; //数量+1
}
public Iterator<Item> iterator() {
return new ListIterator<Item>(first);
}
private class ListIterator<Item> implements Iterator<Item> {
private Node<Item> current;
ListIterator(Node<Item> first) {
current = first;
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return current != null;
}
@Override
public Item next() {
// TODO Auto-generated method stub
if (!hasNext()) {
throw new NoSuchElementException();
}
Item item = current.item;
current = current.next;
return item;
}
@Override
public void remove() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException();
}
}
}
使用背包测试样本标准差
package base.第一章.背包_队列_和栈.背包;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
/**
* Created by MK on 2018/7/17.
* 例如:
* 计算标准输入中的所有Double的值的平均值和样本标准差。
* 如果标准输入中有N个数组,那么平均值为他们的和除以N
* 样本标准差:每个值和平均值之差的平方和除以N-1之后的平方根
*/
public class 样本标准差 {
public static void main(String[] args) {
Bag<Double> numbers = new Bag<Double>();
while (!StdIn.isEmpty())
numbers.add(StdIn.readDouble());
//以下是求得样本的平均数
int N = numbers.size();
double sum = 0.0;
for (double x : numbers)
sum += x;
double mean = sum / N;
//以下是求得样本的标准差
sum = 0.0;
for (double x : numbers)
sum += (x - mean) * (x - mean);
double std = Math.sqrt(sum / (N - 1));
StdOut.printf("Mean: %.2f\n", mean); //换行输出下面的
StdOut.printf("Std dev: %.2f\n", std);
}
}