Coursera-Algorithms,Part I-Robert Sedgewick-Programming Assignment 2

Programming Assignment 2:Deques and Randomized Queues

问题描述

Deque.java

// import java.util.Scanner;  // Uncomment this line when using client testing
import java.util.Iterator;

public class Deque<Item> implements Iterable<Item> {

    private Node first;
    private Node last;
    private int size;

    private class Node
    {
        Node next;
        Node previous;
        Item item;
    }

    public Deque()                           // construct an empty deque
    {   
        first = null;
        last = null;
        size = 0;
    }

    public boolean isEmpty()                 // is the deque empty?
    {   return size == 0;   }

    public int size()                        // return the number of items on the deque
    {   return size;    }

    public void addFirst(Item item)          // add the item to the front
    {
        if (item == null)
        {   throw new java.lang.IllegalArgumentException(); }
        Node oldFirst = first;
        first = new Node();
        first.item = item;
        first.next = oldFirst;
        first.previous = null;
        if (isEmpty()) last = first;
        else oldFirst.previous = first;
        size++;
    }

    public void addLast(Item item)           // add the item to the end
    {
        if (item == null)
        {   throw new java.lang.IllegalArgumentException(); }
        Node oldLast = last;
        last = new Node();
        last.item = item;
        last.previous = oldLast;
        last.next = null;
        if (isEmpty()) first = last;
        else oldLast.next = last;
        size++;
    }

    public Item removeFirst()                // remove and return the item from the front
    {
        if (isEmpty()) throw new java.util.NoSuchElementException();
        Item item = first.item;
        first = first.next;
        if(first == null) last = null;
        else first.previous = null;
        size--;
        return item;
    }

    public Item removeLast()                 // remove and return the item from the end
    {
        if (isEmpty()) throw new java.util.NoSuchElementException();
        Item item = last.item;
        last = last.previous;
        if (last == null) first = null;
        else last.next = null;
        size--;
        return item;
    }

    public Iterator<Item> iterator()         // return an iterator over items in order from front to end
    {   return new IteratorDeque(); }

    private class IteratorDeque implements Iterator<Item>
    {
        private Node current = first;
        public boolean hasNext()
        {   return current != null; }
        public Item next()
        {   
            if (!hasNext())
            {   throw new java.util.NoSuchElementException();   }
            Item item = current.item;
            current = current.next;
            return item;    
        }
        public void remove()
        {   throw new java.lang.UnsupportedOperationException();    }
    }

    public static void main(String[] args)   // unit testing (optional)
    {
        System.out.println("client starts:");


//      Deque<String> deque = new Deque<String>();
//      Scanner scanner = new Scanner(System.in);
//      String str;
//      boolean ifFirst = false;
//      Iterator<String> iterator = deque.iterator();
//      while (true)
//      {      
//          if (ifFirst) System.out.println("Operation on First:");
//          else         System.out.println("Operation on Last:");
//          str = scanner.nextLine();
//          if (str.compareTo("quit") == 0) break;
//          if (str.compareTo("none") == 0) 
//          {   
//              ifFirst = !ifFirst;
//              continue;
//          }
//          if (str.compareTo("-") == 0) 
//          {
//              if (ifFirst) System.out.println(deque.removeFirst());
//              else System.out.println(deque.removeLast());
//          }
//          else if (str.compareTo("count") == 0) System.out.println(deque.size());
//          else if (str.compareTo("all") == 0) 
//          {
//              System.out.println();
//              for (String s : deque)
//              {   System.out.print(s+" ");    }
//              System.out.println();
//          }
//          else if (str.compareTo("null") == 0) 
//          {
//              if (ifFirst) deque.addFirst(null);
//              else deque.addLast(null);
//          }
//          else if (str.compareTo("iter") == 0) 
//          {   iterator = deque.iterator();    }
//          else if (str.compareTo("remove") == 0) 
//          {   iterator.remove();  }
//          else if (str.compareTo("next") == 0) 
//          {   System.out.println(iterator.next());    }
//          else 
//          {
//              if (ifFirst) deque.addFirst(str);
//              else deque.addLast(str);
//          }
//         
//      }
//      scanner.close(); 
    }


}

RandomizedQueue.java
思路:整体上类似栈的实现,取出前将栈顶元素与栈内部随机某个元素交换。

主类的dequeue()方法在实现这个交换时是直接对items[]数组交换的。将这种实现套用到iterator实现时,发现无法通过并行测试和嵌套测试。原因是每个iterator实例在调用next()方法的时候修改了它们共有的items[]数组,导致混乱,出现重复而无法遍历等问题。

因此改进为:每个iterator实例维护一个出栈顺序索引数组idx[],初始化为0,1,2…N-1。每次出栈前对该数组进行前述交换,用idx[]上的交换替代以前那种对items[]具有破坏性的交换。这时每次调用next()方法,只需要返回索引值为idx[--current]的元素即可,即items[idx[--current]]

进一步改进为:iterator实例初始化时就利用StdRandom.shuffle()把它打乱,免去了每次的交换。开销上应该是差不多的,但是代码更清晰。

// import java.util.Scanner;  // Uncomment this line when using client testing
import java.util.Iterator;
import edu.princeton.cs.algs4.StdRandom;

public class RandomizedQueue<Item> implements Iterable<Item> {
    private Item[] items;
    private int N;    

    public RandomizedQueue()                 // construct an empty randomized queue
    {
        items = (Item[]) new Object[1];
        N = 0;
    }

    public boolean isEmpty()                 // is the randomized queue empty?
    {   return N == 0;  }

    public int size()                        // return the number of items on the randomized queue
    {   return N;   }

    public void enqueue(Item item)           // add the item
    {
        if (item == null) throw new java.lang.IllegalArgumentException();
        if (items.length == N)
        {   resize(2 * items.length);   }
        items[N++] = item;
    }

    private void resize(int newSize)
    {
        // System.out.println("Resizing from " + items.length + " to " + newSize); // Debugging info
        Item copy[] = (Item[]) new Object[newSize];
        for (int i = 0; i < N; i++)
        {   copy[i] = items[i]; }
        items = copy;
    }

    public Item dequeue()                    // remove and return a random item
    {
        if (isEmpty()) throw new java.util.NoSuchElementException(); 
        swap(N-1, StdRandom.uniform(N));
        Item item = items[--N];
        items[N] = null;
        if (N == items.length / 4 && N > 0) resize(items.length / 2); 
        return item;
    }

    private void swap(int idx1, int idx2)
    {
        Item temp = items[idx1];
        items[idx1] = items[idx2];
        items[idx2] = temp;     
    }

    public Item sample()                     // return a random item (but do not remove it)
    {
        if (isEmpty()) throw new java.util.NoSuchElementException(); 
        swap(N-1, StdRandom.uniform(N));
        return items[N-1];
    }

    public Iterator<Item> iterator()         // return an independent iterator over items in random order
    {   return new QueueIterator(); }

    private class QueueIterator implements Iterator<Item>
    {
        private int current;    
        private int[] idx;
        public QueueIterator()
        {   
            current = N;
            idx = new int[N];
            for (int i = 0; i < N; i++)
            {   idx[i] = i; }
            StdRandom.shuffle(idx, 0, N);   
        }
//      private void swapIndex(int i, int j)
//      {
//          int temp = idx[i];
//          idx[i] = idx[j];
//          idx[j] = temp;
//      }
        public boolean hasNext()
        {   return current != 0;    }
        public Item next()
        {   
            if (!hasNext()) throw new java.util.NoSuchElementException();
            // swapIndex(current-1, StdRandom.uniform(current));
            return items[idx[--current]];   
        }
        public void remove()
        {   throw new java.lang.UnsupportedOperationException();    }
    }

    public static void main(String[] args)   // unit testing (optional)
    {
        System.out.println("client starts:");


//      // Parallel test and nested test
//      RandomizedQueue<String> queue1 = new RandomizedQueue<String>();
//      for (int i = 1; i < 4; i++)
//      {   queue1.enqueue(i + ""); }
//      RandomizedQueue<String> queue2 = new RandomizedQueue<String>();
//      for (int i = 1; i < 4; i++)
//      {   queue2.enqueue(i + 3 + ""); }
//      RandomizedQueue<String> queue3 = new RandomizedQueue<String>();
//      for (int i = 1; i < 4; i++)
//      {   queue3.enqueue(i + 6 + ""); }
//
//      RandomizedQueue<RandomizedQueue<String>> queueOfQueues = new RandomizedQueue<RandomizedQueue<String>>();
//      queueOfQueues.enqueue(queue1);
//      queueOfQueues.enqueue(queue2);
//      queueOfQueues.enqueue(queue3);
//              
//      Iterator<String> iterator1 = queue1.iterator(); 
//      Iterator<String> iterator2 = queue1.iterator(); 
//      
//      // Parallel test
//      while (iterator1.hasNext())
//      {
//          System.out.print(iterator1.next() + " ");
//          System.out.print(iterator2.next() + " \n");
//      }
//      
//      // Nested test
//      for (RandomizedQueue<String> queue : queueOfQueues)
//      {   
//          System.out.println();
//          for (String s : queue)  
//          {   System.out.print(s + " ");  }
//      }



//      // Interactive test             
//      Scanner scanner = new Scanner(System.in);
//      RandomizedQueue<String> queue = new RandomizedQueue<String>();
//      Iterator<String> iterator = queue.iterator(); 
//      String str;
//      while (true)
//      {
//          str = scanner.nextLine();
//          if (str.compareTo("quit") == 0) break;
//          if (str.compareTo("-") == 0) 
//          {   System.out.println(queue.dequeue());    }
//          else if (str.compareTo("sample") == 0) 
//          {   System.out.println(queue.sample()); }
//          else if (str.compareTo("all") == 0)
//          {   
//              System.out.println();
//              for (String s : queue) System.out.print(s + " ");
//              System.out.println();
//          }
//          else if (str.compareTo("null") == 0)
//          {   queue.enqueue(null);    }
//          else if (str.compareTo("remove") == 0)
//          {   
//              iterator = queue.iterator();
//              iterator.remove();
//          }
//          else if (str.compareTo("iter") == 0)
//          {   
//              iterator = queue.iterator();
//          }
//          else if (str.compareTo("next") == 0)
//          {   
//              System.out.println(iterator.next());
//          }
//          else queue.enqueue(str);
//      }
//      scanner.close();

    }

}

Permutation.java

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import java.util.Iterator;
public class Permutation {
   public static void main(String[] args)
   {
       int k = Integer.parseInt(args[0]);
       RandomizedQueue<String> queue = new RandomizedQueue<String>();
       while (!StdIn.isEmpty())
       {
           queue.enqueue(StdIn.readString());
       }
       Iterator<String> iterator = queue.iterator();
       for (int i = 0; i < k; i++)
       {    StdOut.println(iterator.next());    }
   }
}
### 回答1: Coursera-ml-andrewng-notes-master.zip是一个包含Andrew Ng的机器学习课程笔记和代码的压缩包。这门课程是由斯坦福大学提供的计算机科学和人工智能实验室(CSAIL)的教授Andrew Ng教授开设的,旨在通过深入浅出的方式介绍机器学习的基础概念,包括监督学习、无监督学习、逻辑回归、神经网络等等。 这个压缩包中的笔记和代码可以帮助机器学习初学者更好地理解和应用所学的知识。笔记中包含了课程中涉及到的各种公式、算法和概念的详细解释,同时也包括了编程作业的指导和解答。而代码部分包含了课程中使用的MATLAB代码,以及Python代码的实现。 这个压缩包对机器学习爱好者和学生来说是一个非常有用的资源,能够让他们深入了解机器学习的基础,并掌握如何运用这些知识去解决实际问题。此外,这个压缩包还可以作为教师和讲师的教学资源,帮助他们更好地传授机器学习的知识和技能。 ### 回答2: coursera-ml-andrewng-notes-master.zip 是一个 Coursera Machine Learning 课程的笔记和教材的压缩包,由学生或者讲师编写。这个压缩包中包括了 Andrew Ng 教授在 Coursera 上发布的 Machine Learning 课程的全部讲义、练习题和答案等相关学习材料。 Machine Learning 课程是一个介绍机器学习的课程,它包括了许多重要的机器学习算法和理论,例如线性回归、神经网络、决策树、支持向量机等。这个课程的目标是让学生了解机器学习的方法,学习如何使用机器学习来解决实际问题,并最终构建自己的机器学习系统。 这个压缩包中包含的所有学习材料都是免费的,每个人都可以从 Coursera 的网站上免费获取。通过学习这个课程,你将学习到机器学习的基础知识和核心算法,掌握机器学习的实际应用技巧,以及学会如何处理不同种类的数据和问题。 总之,coursera-ml-andrewng-notes-master.zip 是一个非常有用的学习资源,它可以帮助人们更好地学习、理解和掌握机器学习的知识和技能。无论你是机器学习初学者还是资深的机器学习专家,它都将是一个重要的参考工具。 ### 回答3: coursera-ml-andrewng-notes-master.zip是一份具有高价值的文件,其中包含了Andrew Ng在Coursera上开授的机器学习课程的笔记。这份课程笔记可以帮助学习者更好地理解掌握机器学习技术和方法,提高在机器学习领域的实践能力。通过这份文件,学习者可以学习到机器学习的算法、原理和应用,其中包括线性回归、逻辑回归、神经网络、支持向量机、聚类、降维等多个内容。同时,这份笔记还提供了很多代码实现和模板,学习者可以通过这些实例来理解、运用和进一步深入研究机器学习技术。 总的来说,coursera-ml-andrewng-notes-master.zip对于想要深入学习和掌握机器学习技术和方法的学习者来说是一份不可多得的资料,对于企业中从事机器学习相关工作的从业人员来说也是进行技能提升或者知识更新的重要资料。因此,对于机器学习领域的学习者和从业人员来说,学习并掌握coursera-ml-andrewng-notes-master.zip所提供的知识和技能是非常有价值的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值