查看: 8970| 回复: 48
跳转到指定楼层
上一主题 下一主题
收起左侧

[入门|算法|数据结构] [HomeWork] Algorithms, Part I (week 3)

全局:
公开课
学校名称: Princeton
Unit号: 6
开课时间: 2015-01-23
课程全名: Algorithms, Part I
平台: Coursera

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 vancexu 于 2015-2-13 01:40 编辑

没看到有人post,就自开一贴,一起跟课的朋友们加油!
Fast里面的subsegment真的很trick,看了forum里的讨论才搞定。
高能搬运,相当剧透:
draw the segment only if current point is lower than all the others collinear points









上一篇:分享一个MIT公开课的网站(除了CS, 还有各种学科~ 我是ME的^^)
下一篇:[Homework] Algorithms: Design and Analysis, Part I (Week 3)
推荐
ypandxy 2015-7-23 14:22:17 | 只看该作者
全局:
本帖最后由 ypandxy 于 2015-7-23 14:39 编辑

debug 好久,还是应该先想好,再弄,唯一不过的是Fast timing 问题,难道要自己写一个mergesort么?


Fast里面,我用一个ArrayList <Point>[]  lines 存储当前的找到的直线的全部point(用于输出),用另一个ArrayList<Point>[]  storeLines 存储已经找到的直线的min point 和 max point.  然后通过新找到的直线的min point 和 已经找到的直线的端点比较,
if (新直线和已经存储直线斜率相同 && (新直线minpoint. slopeTo(已存储直线minpoint) == 已存储直线minpoint.slopeTo(已存储直线maxpoint)) )
        sameline = true;
回复

使用道具 举报

全局:
求版主多加分~  o(* ̄▽ ̄*)ゞ
回复

使用道具 举报

推荐
FFFelix 2016-3-1 23:23:46 | 只看该作者
全局:
自己写的一直有问题 大家能否帮我看一下。 Brute解法我的答案如下:
  1. import edu.princeton.cs.algs4.*;
  2. import java.util.Arrays;

  3. public class BruteCollinearPoints{

  4.         private int SegNum = 0;
  5.         private LineSegment[] res = new LineSegment[1];

  6.         public BruteCollinearPoints(Point[] points){

  7.                 if (points == null) {
  8.                         throw new java.lang.NullPointerException();
  9.                 } //argument is null

  10.                 for (Point point : points) {
  11.                         if(point == null) throw new java.lang.NullPointerException();
  12.                 } //point is null

  13.                 for (int i = 0; i < points.length; i++) {
  14.                         for (int j = i+1; j < points.length; j++) {
  15.                                 if(points[i].compareTo(points[j]) == 0) throw new java.lang.IllegalArgumentException();
  16.                         }
  17.                 } //repeated point

  18.                 for (int i = 0; i < points.length; i++) {
  19.                         Point p = points[i];
  20.                         for (int j = i+1; j < points.length; j++) {
  21.                                 Point q = points[j];
  22.                                 for (int k = j+1; j < points.length; k++) {
  23.                                         Point r = points[k];
  24.                                         if(p.slopeTo(q) != q.slopeTo(r)) continue;
  25.                                         for (int l = k+1; l < points.length; l++) {
  26.                                                 Point s = points[l];
  27.                                                 if(q.slopeTo(r) == r.slopeTo(s)){
  28.                                                         Point[] resPoint = new Point[]{p, q, r, s};
  29.                                                         Arrays.sort(resPoint);
  30.                                                         LineSegment LS = new LineSegment(resPoint[0], resPoint[3]);
  31.                                                         res[SegNum++] = LS;
  32.                                                         if(SegNum == res.length) resize(2 * res.length);
  33.                                                 }
  34.                                         }
  35.                                        
  36.                                 }
  37.                         }
  38.                 }
  39.         }

  40.         private void resize(int capacity){
  41.                 LineSegment[] temp = new LineSegment[capacity];
  42.                 for (int i = 0; i < SegNum; i++) {
  43.                         temp[i] = res[i];
  44.                 }
  45.                 res = temp;
  46.         }

  47.         public int numberOfSegments(){
  48.                 return SegNum;
  49.         }

  50.         public LineSegment[] segments(){
  51.                 return res;
  52.         }

  53. }         
复制代码


但是用他给的sample client一直有问题 总是出现 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 56
        at BruteCollinearPoints.<init>(BruteCollinearPoints.java:33) ...转专业还是太弱了
回复

使用道具 举报

🔗
gqjapply 2015-2-13 01:42:39 | 只看该作者
全局:
的确啊!!那个subsegment弄了超久!!
回复

使用道具 举报

🔗
birdor 2015-2-15 13:43:40 | 只看该作者
全局:
这周的作业很费时间啊。


回复

使用道具 举报

🔗
letsdoit666 2015-2-15 14:18:18 | 只看该作者
全局:
求问-  wrong order: slope-ascending, y-ascending, x-ascending (but should not depend on x, y)这个问题怎么解决啊?
我Fast是定义了一个hashmap,每次保存一个斜率的数值和这条线上的最后一个点来避免重复,但是time test里的最后一个test老是通不过,求指教。谢谢!
回复

使用道具 举报

🔗
 楼主| vancexu 2015-2-15 16:33:21 | 只看该作者
全局:
letsdoit666 发表于 2015-2-15 14:18
求问-  wrong order: slope-ascending, y-ascending, x-ascending (but should not depend on x, y)这个问 ...

不好意思,没有出现过这个wrong order这个问题,也没有使用hashmap(貌似课程要求没学过的数据结构都不能用)。
我解决permutation是靠最开始的sort by position。解决subsegement也是靠加一句判断point position,就是只有当你现在check的这个点比所有其他共线的点的position都小的时候才画线。
回复

使用道具 举报

🔗
letsdoit666 2015-2-16 00:14:36 | 只看该作者
全局:
交作业了







回复

使用道具 举报

🔗
letsdoit666 2015-2-16 00:17:48 | 只看该作者
全局:
vancexu 发表于 2015-2-15 16:33
不好意思,没有出现过这个wrong order这个问题,也没有使用hashmap(貌似课程要求没学过的数据结构都不能 ...

有一个问题哎,我个人觉得之前不需要排序,但是这样出来的report里出现了莫名奇妙的很多错误。意思是之前必须得Arrays.sort一下,但是我觉得没必要,不懂层主怎么看?
回复

使用道具 举报

🔗
 楼主| vancexu 2015-2-16 08:26:23 | 只看该作者
全局:
letsdoit666 发表于 2015-2-16 00:17
有一个问题哎,我个人觉得之前不需要排序,但是这样出来的report里出现了莫名奇妙的很多错误。意思是之前 ...

题目中要求输出segment要有序的,所以我很自然的想到要在之前sort一下。你是怎么想的,为什么觉得没必要先sort?
回复

使用道具 举报

🔗
czbnlzd920706 2015-2-16 13:00:20 | 只看该作者
全局:
这次作业中的好多东西都是看了网上的才知道的。惭愧。
比如,怎么解决重复画线的问题,我自己所能想到的就是遍历一下之前的点,如果有相等的就不画。然后网上给的做法真的很奇妙。我想不到。当然这种做法有一个很细节的注意点,我们需要提前定义一个pSlope,然后用来暂存i之前的斜率,这个pSlope不能随意初始化,只能初始化为,负无穷,即同一个点。否则就是Bug。因为在再赋值之前,系统会把这个初始值当作是 i 前的斜率,如果和 i 后的斜率正好相等,那么系统就会误解成,i 后的这个斜率在之前已经存在了,就把这条线给遗漏了。我是调试之后才发现的这个问题。所以必须把pSlope设置为一个i 后的斜率不可能到达值,但很明显,斜率的范围涵盖了所有值。所以只能把pSlope设置为即使可以到达,即使i 后面的斜率与这个初始值相等,系统也没有误判。那只可能是 负无穷,即 i后的多个点与 i 点其实是一点,那么他们是不可以画线的。
还有一开始的一个误区,我总以为,一个起点,只能最多有一条线段。所以进入那个画线的分支后就直接break,没进入则,head++,tail++. 脑子犯浑了。
还有之前java基本零基础。提示说 用 Arrays.sort() 来进行排序,一开始真的不懂。
这次作业最大的帮助可能是知道 Comparator怎么用了。然后思考问题的方法。一些很细节的东西只有Debug的时候才能发现。

1.png (32.39 KB, 下载次数: 0)

1.png
回复

使用道具 举报

🔗
New613Life 2015-2-16 22:56:18 | 只看该作者
本楼:
全局:
交作业啦。

week3_Collinear Points.jpg (169.78 KB, 下载次数: 0)

week3_Collinear Points.jpg
回复

使用道具 举报

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

本版积分规则

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