楼主: 逃亡~
跳转到指定楼层
上一主题 下一主题
收起左侧

Berkeley CS 61B Homework8

 
🔗
xyh110191 2017-2-2 07:36:43 | 只看该作者
全局:
hw8比较简单,按作业要求里的步骤写出来就好。
mergeSort: 若key相等先enqueue前面的,stable.
quickSort: partition时若k1=k2, k1先被dequeue,因此先被enqueue到qSmall/qEqual/qLarge,因此k1还是在k2前面,最后append不改变顺序, stable.

Screenshot 2017-02-01 15.27.35.png (89.84 KB, 下载次数: 0)

Screenshot 2017-02-01 15.27.35.png
回复

使用道具 举报

🔗
csssssss 2017-2-10 11:39:10 | 只看该作者
全局:
挺简单的一次作业,自己蠢,写了俩bug调了半天,哎,不过也对两个sort理解更深刻吧

M]QNEL_JRBB]CX8([QVTMOX.png (7.13 KB, 下载次数: 1)

M]QNEL_JRBB]CX8([QVTMOX.png
回复

使用道具 举报

全局:
自己写了各个method的测试代码,供大家测试使用。
  1.     System.out.println("/* Test makeQueueOfQueues */");
  2.     LinkedQueue q1 = makeRandom(15);
  3.     System.out.println("q1:" + q1.toString());
  4.     LinkedQueue q2 = makeQueueOfQueues(q1);
  5.     System.out.println("q1:" + q1.toString());
  6.     System.out.println("q2:" + q2.toString());   
  7.     System.out.println("\n");

  8.     System.out.println("/* Test mergeSortedQueues */");
  9.     LinkedQueue q3 = new LinkedQueue();
  10.     q3.enqueue(new Integer(0));
  11.     q3.enqueue(new Integer(2));
  12.     q3.enqueue(new Integer(4));
  13.     q3.enqueue(new Integer(6));
  14.     q3.enqueue(new Integer(8));
  15.     LinkedQueue q4 = new LinkedQueue();
  16.     q4.enqueue(new Integer(1));
  17.     q4.enqueue(new Integer(3));
  18.     q4.enqueue(new Integer(5));
  19.     q4.enqueue(new Integer(7));
  20.     q4.enqueue(new Integer(9));
  21.     q4.enqueue(new Integer(11));
  22.     q4.enqueue(new Integer(13));
  23.     q4.enqueue(new Integer(15));
  24.     System.out.println("q3:" + q3.toString());
  25.     System.out.println("q4:" + q4.toString());

  26.     LinkedQueue q5 = mergeSortedQueues(q3, q4);
  27.     System.out.println("q3:" + q3.toString());
  28.     System.out.println("q4:" + q4.toString());
  29.     System.out.println("q5:" + q5.toString());
  30.     System.out.println("\n");

  31.     System.out.println("/* Test mergeSort */");
  32.     LinkedQueue q = makeRandom(25);
  33.     System.out.println("q: " + q.toString());
  34.     mergeSort(q);
  35.     System.out.println("q: " + q.toString());
  36.     System.out.println("\n");

  37.     System.out.println("/* Test partition */");
  38.     LinkedQueue q6 = makeRandom(20);
  39.     System.out.println("q6:" + q6.toString());
  40.     LinkedQueue q6Small = new LinkedQueue();
  41.     LinkedQueue q6Equals = new LinkedQueue();
  42.     LinkedQueue q6Large = new LinkedQueue();
  43.     int pivotNum = ThreadLocalRandom.current().nextInt(1, q6.size() + 1);
  44.     Comparable pivot = (Comparable) q6.nth(pivotNum);
  45.     System.out.println("pivot is: " + pivot);
  46.     partition(q6, pivot, q6Small, q6Equals, q6Large);

  47.     System.out.println("q6:" + q6.toString());
  48.     System.out.println("q6Small:" + q6Small.toString());
  49.     System.out.println("q6Equals:" + q6Equals.toString());
  50.     System.out.println("q6Large:" + q6Large.toString());
  51.     System.out.println("\n");

  52.     System.out.println("/* Test quickSort */");
  53.     q = makeRandom(100);
  54.     System.out.println(q.toString());
  55.     quickSort(q);
  56.     System.out.println(q.toString());
  57.     System.out.println("\n");

  58.     /* Remove these comments for Part III. */
  59.     System.out.println("/* Test Part III */");
  60.     Timer stopWatch = new Timer();
  61.     q = makeRandom(SORTSIZE);
  62.     stopWatch.start();
  63.     mergeSort(q);
  64.     stopWatch.stop();
  65.     System.out.println("Mergesort time, " + SORTSIZE + " Integers:  " +
  66.                        stopWatch.elapsed() + " msec.");

  67.     stopWatch.reset();
  68.     q = makeRandom(SORTSIZE);
  69.     stopWatch.start();
  70.     quickSort(q);
  71.     stopWatch.stop();
  72.     System.out.println("Quicksort time, " + SORTSIZE + " Integers:  " +
  73.                        stopWatch.elapsed() + " msec.");
  74.     System.out.println("\n");

  75.     System.out.println("/* Test Part IV */");
  76.     LinkedQueue q7 = new LinkedQueue();
  77.     Entry e1 = new Entry(new Integer(3), "spa");
  78.     Entry e2 = new Entry(new Integer(7), "hex");
  79.     Entry e3 = new Entry(new Integer(3), "boo");
  80.     Entry e4 = new Entry(new Integer(7), "for");
  81.     q7.enqueue(e1);
  82.     q7.enqueue(e2);
  83.     q7.enqueue(e3);
  84.     q7.enqueue(e4);

  85.     System.out.println("\t\t q7: " + q7);
  86.     mergeSort(q7);
  87.     System.out.println("After mergeSort, q7: " + q7);
  88.     System.out.println("\n");

  89.     LinkedQueue q8 = new LinkedQueue();
  90.     q8.enqueue(e1);
  91.     q8.enqueue(e2);
  92.     q8.enqueue(e3);
  93.     q8.enqueue(e4);

  94.     System.out.println("\t\t q8: " + q8);
  95.     quickSort(q8);
  96.     System.out.println("After quickSort, q8: " + q8);
复制代码


最后的 Part IV 用到了之前作业的Entry.java。方便debug,加上了 toString() 和 compareTo()。
  1. /* Entry.java */

  2. /**
  3. *  A class for dictionary entries.
  4. **/

  5. public class Entry implements Comparable <Entry> {

  6.   protected Object key;
  7.   protected Object value;
  8.   
  9.   public Entry (Object k, Object v) {
  10.     key = k;
  11.     value = v;
  12.   }

  13.   public Object key() {
  14.     return key;
  15.   }

  16.   public Object value() {
  17.     return value;
  18.   }

  19.   //Add toString for testing
  20.   public String toString() {
  21.     return "[" + key + ", " + value + "]";
  22.   }

  23.   public int compareTo(Entry e) {
  24.     Comparable thisComp = (Comparable) key;
  25.     Comparable eComp = (Comparable) e.key;
  26.     if (thisComp.compareTo(eComp) < 0) {return -1;}
  27.     else if (thisComp.compareTo(eComp) == 0) {return 0;}
  28.     else {return 1;}
  29.   }

  30. }
复制代码


Part III and Part IV
  1. Part III.  Running time comparisons

  2.   List size         mergesort             quicksort
  3.       100              1 ms                 0 ms
  4.     1,000              2 ms                 1 ms
  5.    10,000              8 ms                 9 ms
  6.   100,000            200 ms               121 ms
  7. 1,000,000           2308 ms              1442 ms

  8. Part IV.

  9.   Is mergesort stable?  
  10.   Why or why not?
  11.   Yes. Because when there are two keys are equal, the key from q1 (left)
  12.   will be enqueued, which comes from the left. In this case, the order is
  13.   remained. However, if the key from q2 (right) will be enqueued, then the
  14.   order cannot be remained.

  15.   Is quicksort stable?  
  16.   Why or why not?
  17.   Yes. Because all equal keys are preserved in qEquals queue and they are
  18.   enqueued in the order which they have in the original queue. Therefore,
  19.   the order are retained.
复制代码
更多图片 小图 大图
组图打开中,请稍候......
回复

使用道具 举报

🔗
蔚蔚酱 2017-3-13 21:36:03 | 只看该作者
全局:
这次作业挺简单的哈哈~老师的测试时间的代码还没看,先交作业!

hw8.PNG (8.56 KB, 下载次数: 1)

hw8.PNG
回复

使用道具 举报

🔗
yc4465226 2017-3-13 21:48:54 | 只看该作者
全局:
第八次作业

QQ截图20170313214814.png (7.98 KB, 下载次数: 1)

QQ截图20170313214814.png
回复

使用道具 举报

全局:
本帖最后由 DetectiveConan 于 2017-3-14 00:39 编辑
俘虏你的心 发表于 2017-3-9 15:20
自己写了各个method的测试代码,供大家测试使用。

受到这位同学的启发,我对test code中part IV进行了一个小改动(增加一个entry,使LinkedQueue中的item数量为奇数)
  1. System.out.println("/* Test Part IV */");
  2.     LinkedQueue q7 = new LinkedQueue();
  3.     Entry e1 = new Entry(new Integer(3), "spa");
  4.     Entry e2 = new Entry(new Integer(7), "hex");
  5.     Entry e3 = new Entry(new Integer(3), "boo");
  6.     Entry e4 = new Entry(new Integer(7), "for");
  7.     // add one more item, so that total number is odd.
  8.     Entry e5 = new Entry(new Integer(3), "mee");
  9.     q7.enqueue(e1);
  10.     q7.enqueue(e2);
  11.     q7.enqueue(e3);
  12.     q7.enqueue(e4);
  13.     q7.enqueue(e5);

  14.     System.out.println("\t\t q7: " + q7);
  15.     mergeSort(q7);
  16.     System.out.println("After mergeSort, q7: " + q7);
  17.     System.out.println("\n");

  18.     LinkedQueue q8 = new LinkedQueue();
  19.     q8.enqueue(e1);
  20.     q8.enqueue(e2);
  21.     q8.enqueue(e3);
  22.     q8.enqueue(e4);
  23.     q8.enqueue(e5);

  24.     System.out.println("\t\t q8: " + q8);
  25.     quickSort(q8);
  26.     System.out.println("After quickSort, q8: " + q8);
复制代码
然后运行就可以发现:当q1.key == q2.key时,如果mergesort中先加入q1.key,再加入q2.key的话,那么这样实现的mergesort是unstable.

Screenshot from 2017-03-14 00-39-26.png (12.5 KB, 下载次数: 0)

Screenshot from 2017-03-14 00-39-26.png
回复

使用道具 举报

🔗
cahuanger 2017-3-23 14:42:39 | 只看该作者
全局:
求学分,时间这么长,不明白是自己太垃圾了还是电脑太垃圾了....

J%}MYHMB(M7]W)9QOG6CDV9.png (15.77 KB, 下载次数: 0)

J%}MYHMB(M7]W)9QOG6CDV9.png
回复

使用道具 举报

全局:

交作业。作业里mergesort的实现思路和G&T里的Nonrecursive Array-Based Implementation of Merge-Sort的思想是一样的,巩固了一下。


回复

使用道具 举报

🔗
splansher 2017-5-12 15:49:49 | 只看该作者
全局:
我的mergeSort stable的,因为我的 merge方法,在item1<=item2时,都q1.deque(如果item<item2,q1.deque,就不stable了),所以整个顺序不变。
quickSort 也是stable的,因为整个qEqual的 item里面没有没移动过。


求加学分!!!另外之前的学分也没加!!

1494573959(1).png (11.75 KB, 下载次数: 1)

hw8

hw8
回复

使用道具 举报

🔗
mmyn 2017-5-16 01:41:46 | 只看该作者
全局:
恩,不该浪费这么长时间的其实,只是我忘记了void method把q给empty了之后,可以用append()给结果加回来,结果研究了半天形参和reference、object,还有函数间传递等等等等,也不算全无收获吧,就当复习基本概念了(虽然我一开始的概念就是对的,只是蠢了而已……)另外这次作业蛮简单的,因为每一步的提示都太到位了,每一个方法如何实现,算法老师都给写出来了,说实话感觉更像是一次lab吧。至于stable的问题,我的结论和楼上老哥一样~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表