算法导论第四版学习——习题二Deques and Randomized Queues

题目正文:

http://coursera.cs.princeton.edu/algs4/assignments/queues.html

作业难点:

1、选择使用链表还是数组,将会是第一个问题,选择合适会减少很多工作量。

2、并行从RandomizedQueue中取两个枚举,这两个枚举必须是不一样的,所以有很多偷懒的“伪随机”是行不通的。

3、SubSet仅需K存储而不是N存储,即可实现。(这个我也没想到方法实现)

作业技巧:

1、可遍数组和邻接节点两种数据结构都已经给你了,你只要改改,基本上实现第一个Deque没有任何难度

2、RandomizedQueue涉及到一个基本面试题问题,如果有一个0到100的数组,随机取不重复的元素,如何实现?

从大小为N的数组A中随机[0,N)取下标x的元素A[x],让A[x]与A[N-1]交换,再随机[0,N-1)取下标x的元素A[y]与A[N-2]交换,以此类推。

3、无论是编译还是网站测试都会报警数组泛型的问题,这个可以百度,JAVA数组不支持泛型。对于作业来说忽略就好了。

代码参考:

(这是我自己亲测100分的答案,不代表写得最好,请在自己实在完成不了的时候再看,不然的话做这个题目的意义一点都没有)

  1 import edu.princeton.cs.algs4.StdIn;
  2 import edu.princeton.cs.algs4.StdOut;
  3
  4 import java.util.Iterator;
  5 import java.util.NoSuchElementException;
  6
  7
  8 public class Deque<Item> implements Iterable<Item> {
  9     private int n;
 10     private Node first;
 11     private Node last;
 12
 13     public Deque() // construct an empty deque
 14      {
 15         n = 0;
 16         first = null;
 17         last = null;
 18     }
 19
 20     public boolean isEmpty() // is the deque empty?
 21      {
 22         return first == null;
 23     }
 24
 25     public int size() // return the number of items on the deque
 26      {
 27         return n;
 28     }
 29
 30     public void addFirst(Item item) // add the item to the front
 31      {
 32         if (item == null) {
 33             throw new NullPointerException();
 34         }
 35
 36         Node oldfirst = first;
 37         first = new Node();
 38         first.item = item;
 39         first.next = oldfirst;
 40
 41         if (oldfirst == null) {
 42             last = first;
 43         } else {
 44             oldfirst.prev = first;
 45         }
 46
 47         n++;
 48     }
 49
 50     public void addLast(Item item) // add the item to the end
 51      {
 52         if (item == null) {
 53             throw new NullPointerException();
 54         }
 55
 56         Node oldlast = last;
 57         last = new Node();
 58         last.item = item;
 59         last.prev = oldlast;
 60
 61         if (oldlast == null) {
 62             first = last;
 63         } else {
 64             oldlast.next = last;
 65         }
 66
 67         n++;
 68     }
 69
 70     public Item removeFirst() // remove and return the item from the front
 71      {
 72         if (isEmpty()) {
 73             throw new NoSuchElementException();
 74         }
 75
 76         Item item = first.item;
 77         first = first.next;
 78
 79         if (first == null) {
 80             last = null;
 81         } else {
 82             first.prev = null;
 83         }
 84
 85         n--;
 86
 87         return item;
 88     }
 89
 90     public Item removeLast() // remove and return the item from the end
 91      {
 92         if (isEmpty()) {
 93             throw new NoSuchElementException();
 94         }
 95
 96         Item item = last.item;
 97         last = last.prev;
 98
 99         if (last == null) {
100             first = null;
101         } else {
102             last.next = null;
103         }
104
105         n--;
106
107         return item;
108     }
109
110     public Iterator<Item> iterator() // return an iterator over items in order from front to end
111      {
112         return new DequeIterator();
113     }
114
115     public static void main(String[] args) // unit testing
116      {
117         Deque<String> deque = new Deque<String>();
118
119         while (!StdIn.isEmpty()) {
120             String item = StdIn.readString();
121
122             if (item.equals("+")) {
123                 item = StdIn.readString();
124                 deque.addFirst(item);
125             } else if (item.equals("++")) {
126                 item = StdIn.readString();
127                 deque.addLast(item);
128             } else if (item.equals("exit")) {
129                 break;
130             } else if (item.equals("show")) {
131                 for (String s : deque) {
132                     StdOut.println(s);
133                 }
134             } else if (item.equals("-")) {
135                 if (!deque.isEmpty()) {
136                     StdOut.print(deque.removeFirst() + " ");
137                 }
138             } else if (item.equals("--")) {
139                 if (!deque.isEmpty()) {
140                     StdOut.print(deque.removeLast() + " ");
141                 }
142             }
143         }
144
145         StdOut.println("(" + deque.size() + " left on deque)");
146     }
147
148     private class DequeIterator implements Iterator<Item> {
149         private Node current = first;
150
151         public boolean hasNext() {
152             return current != null;
153         }
154
155         public void remove() {
156             throw new UnsupportedOperationException();
157         }
158
159         public Item next() {
160             if (!hasNext()) {
161                 throw new NoSuchElementException();
162             }
163
164             Item item = current.item;
165             current = current.next;
166
167             return item;
168         }
169     }
170
171     private class Node {
172         private Item item;
173         private Node next;
174         private Node prev;
175     }
176 }

Deque

  1 import edu.princeton.cs.algs4.StdIn;
  2 import edu.princeton.cs.algs4.StdOut;
  3 import edu.princeton.cs.algs4.StdRandom;
  4
  5 import java.util.Iterator;
  6 import java.util.NoSuchElementException;
  7
  8
  9 public class RandomizedQueue<Item> implements Iterable<Item> {
 10     private Item[] a; // array of items
 11     private int n; // number of elements on stack
 12
 13     public RandomizedQueue() // construct an empty randomized queue
 14      {
 15         a = (Item[]) new Object[2];
 16         n = 0;
 17     }
 18
 19     public boolean isEmpty() // is the queue empty?
 20      {
 21         return n == 0;
 22     }
 23
 24     public int size() // return the number of items on the queue
 25      {
 26         return n;
 27     }
 28
 29     // resize the underlying array holding the elements
 30     private void resize(int capacity) {
 31         assert capacity >= n;
 32
 33         Item[] temp = (Item[]) new Object[capacity];
 34
 35         for (int i = 0; i < n; i++) {
 36             temp[i] = a[i];
 37         }
 38
 39         a = temp;
 40     }
 41
 42     public void enqueue(Item item) // add the item
 43      {
 44         if (item == null) {
 45             throw new NullPointerException();
 46         }
 47
 48         if (n == a.length) {
 49             resize(2 * a.length); // double size of array if necessary
 50         }
 51
 52         a[n++] = item; // add item
 53     }
 54
 55     public Item dequeue() // remove and return a random item
 56      {
 57         if (isEmpty()) {
 58             throw new NoSuchElementException();
 59         }
 60
 61         int targetid = StdRandom.uniform(0, n);
 62         Item item = a[targetid];
 63         a[targetid] = a[n - 1];
 64         a[n - 1] = null; // to avoid loitering
 65         n--;
 66
 67         // shrink size of array if necessary
 68         if ((n > 0) && (n == (a.length / 4))) {
 69             resize(a.length / 2);
 70         }
 71
 72         return item;
 73     }
 74
 75     public Item sample() // return (but do not remove) a random item
 76      {
 77         if (isEmpty()) {
 78             throw new NoSuchElementException();
 79         }
 80
 81         int targetid = StdRandom.uniform(0, n);
 82
 83         return a[targetid];
 84     }
 85
 86     public Iterator<Item> iterator() // return an independent iterator over items in random order
 87      {
 88         return new RandomizedQueueIterator();
 89     }
 90
 91     public static void main(String[] args) // unit testing
 92      {
 93         RandomizedQueue<String> queue = new RandomizedQueue<String>();
 94
 95         while (!StdIn.isEmpty()) {
 96             String item = StdIn.readString();
 97
 98             if (item.equals("-") && !queue.isEmpty()) {
 99                 StdOut.print(queue.dequeue() + " ");
100             }
101             else if (item.equals("--") && !queue.isEmpty()) {
102                 StdOut.print(queue.sample() + " ");
103             }
104             else if (item.equals("show")) {
105                 for (String s : queue) {
106                     StdOut.println(s);
107                 }
108             }
109             else if (item.equals("size")) {
110                 StdOut.println("(" + queue.size() + " left on stack)");
111             }
112             else if (item.equals("exit")) {
113                 break;
114             }
115             else {
116                 queue.enqueue(item);
117             }
118         }
119
120         StdOut.println("(" + queue.size() + " left on stack)");
121     }
122
123     private class RandomizedQueueIterator implements Iterator<Item> {
124         private int i;
125         private Item[] temp;
126
127         public RandomizedQueueIterator() {
128             i = n - 1;
129             temp = (Item[]) new Object[a.length];
130             for (int j = 0; j < n; j++) {
131                 temp[j] = a[j];
132             }
133         }
134
135         public boolean hasNext() {
136             return i >= 0;
137         }
138
139         public void remove() {
140             throw new UnsupportedOperationException();
141         }
142
143         public Item next() {
144             if (!hasNext()) {
145                 throw new NoSuchElementException();
146             }
147
148             int targetid = StdRandom.uniform(0, i + 1);
149             Item item = temp[targetid];
150             temp[targetid] = temp[i];
151             temp[i] = item;
152             i--;
153             return item;
154         }
155     }
156 }

RandomizedQueue

 1 import edu.princeton.cs.algs4.StdIn;
 2 import edu.princeton.cs.algs4.StdOut;
 3 public class Subset {
 4     public static void main(String[] args) {
 5         RandomizedQueue<String> queue = new RandomizedQueue<String>();
 6         int num = Integer.parseInt(args[0]);
 7
 8         while (!StdIn.isEmpty()) {
 9             String item = StdIn.readString();
10             // if (item.equals("exit")) {
11             //    break;
12             // }
13             queue.enqueue(item);
14         }
15
16         for (String s : queue) {
17             if (num == 0) {
18                 break;
19             }
20
21             StdOut.println(s);
22             num--;
23         }
24     }
25 }

Subset

时间: 2024-10-19 07:16:04

算法导论第四版学习——习题二Deques and Randomized Queues的相关文章

算法导论第四版学习——习题三Collinear Points

题目正文: http://coursera.cs.princeton.edu/algs4/assignments/collinear.html 作业难点: 1.仔细思考会感觉有很多实现方法,但是如果没有适当使用排序,算法时间复杂度就会轻易超过要求.(包括暴力算法) 2.隐含需要实现自己的数据结构用来组织“线”的集合,当然也可以用Stack或者Queue或者LinkedList,但是我个人是自己实现的. 3.由于一条线段只能出现一次,所以有一个去重的问题.(最难) 作业技巧: 1.基本按照题目的先

算法导论第四版学习——习题一Percolation

题目正文: http://coursera.cs.princeton.edu/algs4/assignments/percolation.html 作业难点: 1.backwash(倒灌)的判断,如果不使用另一个WeightedUnionFind对象,要在要求的时间和空间范围内实现是很困难的 和论坛里的学生一样,尝试只只使用上部的虚拟节点,下部判断联通使用循环+break,提交后不满足时间复杂度要求 你也可以不考虑backwash这种情况,因为backwash对连通性并没有直接影响 2.Unio

算法导论第四版学习——习题五Kd-Tree

题目正文: http://coursera.cs.princeton.edu/algs4/assignments/kdtree.html 作业难点: 如何组织自己的数据结构是本道题的最难点,基本上有思路就肯定可以完成.题目一定要看仔细,基本上2dtree部分已经把实现原理说清楚了. 作业技巧: 1.逐步实现,实现完成后用insert.contain测试下,没问题再写draw,测试没问题再写其余的. 2.重复输入的问题不要忘了 3.range虽然api里写的是all point inside th

算法导论第四版学习——习题四8 Puzzle

题目正文: http://coursera.cs.princeton.edu/algs4/assignments/8puzzle.html 作业难点: 1.如何验证Puzzle是否可解?题目中有提示,如果相邻两个格子交换后得到的“Twin Puzzle”进行求解,如果Twin有解那么原始Puzzle就无解. 作业技巧: 1.checklist提到把Twin Puzzle和Puzzle放在一个Priority Queue中,其实就是在设计自己的Node数据结构的时候加一个boolean类型标识是否

算法第四版学习笔记二(有趣的递归算法)

1.public static String exR1(int n){ if(n<=0) return ""; return exR1(n-3)+ n + exR1(n-2) + n; } System.out.println(exR1(6)); //311361142246 2.public static String exR2(int n){ String s = exR1(n-3)+ n + exR1(n-2) + n; if(n<=0) return "&

Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(二)之Introduction to Objects

The genesis of the computer revolution was a machine. The genesis of out programming languages thus tends to look like that machine. 计算机革命起源于机器,因此编程语言的产生也始于对机器的模仿 Computers are mind amplification tools and a different kind of expressive medium. 计算机是大

算法Sedgewick第四版-第1章基础-1.3Bags, Queues, and Stacks-001可变在小的

1. package algorithms.stacks13; /****************************************************************************** * Compilation: javac ResizingArrayBag.java * Execution: java ResizingArrayBag * Dependencies: StdIn.java StdOut.java * * Bag implementatio

算法第四版学习笔记之快速排序 QuickSort

软件:DrJava 参考书:算法(第四版) 章节:2.3快速排序(以下截图是算法配套视频所讲内容截图) 1:快速排序 2:

计算机组成原理_第四版课后习题答案(完整版)

计算机组成原理_第四版课后习题答案(完整版) ?第一章 1.?比较数字计算机和模拟计算机的特点. 解:模拟计算机的特点:数值由连续量来表示,运算过程是连续的: 数字计算机的特点:数值由数字量(离散量)来表示,运算按位进行. 两者主要区别见P1?表1.1. 2.?数字计算机如何分类?分类的依据是什么? 解:分类: 数字计算机分为专用计算机和通用计算机.通用计算机又分为巨型机.大型机. 中型机.小型机.微型机和单片机六类. 分类依据:专用和通用是根据计算机的效率.速度.价格.运行的经济性和适应性来划