Programming Assignment 3: Pattern Recognition

1.题目重述

原题目:Programming Assignment 3: Pattern Recognition

题目给定n个二维平面点,搜索能够连成线的大于等于四个点的集合。需要分别实现三个类,点的类,暴力搜索,快速搜索。

点的类需要实现根据点的坐标比较以及两个点根据某个点的斜率的比较。

暴力搜索和快速搜索均需要实现寻找点的功能。

2.分析

主要是分析如何实现暴力搜索和快速搜索。

2.1 暴力搜索

这个一开始读题我还没读懂,还以为只会给四个点,要求判断是否共线。

题目要求的性能是n^4,明显就是四重循环,建立一个比较斜率的比较器,第二重和第三重循环的点相对于第一重循环的斜率比较,若相同,则说明这三点共线,再去第四重循环寻找最后一个点。

2.2 快速搜索

这道题的思路在题目里已经很清晰了,就是计算每一个点和其他点的斜率,然后按照斜率排序,寻找其中斜率相同的部分,若大于等于4个,就是满足题目要求的共线。

由于写了比较器,可以不计算斜率,直接在sort时送入参数即可。这时我是将计算斜率的参考点和相同的点最后一个相连,这个思路是错误的。

按上面做完确实可以找到所有共线的点了,但是解是错误的,若这条线上有超过4个点,就会有重复的线段出现。甚至有的线段长度都小于4。

怎么解决这个问题呢?

这时候想到Arrays提供的sort是稳定的,我们最初的point数组是根据点的坐标大小进行排序的,然后又根据斜率进行排序。

因为排序是稳定的,所以同斜率中,第一个肯定时坐标最小的点,即起点,只需要比较计算斜率的参考点和同斜率中第一个点谁小就可以判断参考点是不是起点了。就实现了去重。

2.3 代码实现

collinear

3.一些思考

提交答案时,除了api以外的函数,如果设置为public,直接就0分。实际写程序中,对于public和private考虑的比较少。要思考那些不应该被client访问,那些一定要设置成private。

参考

1.普林斯顿大学算法Week3:CollinearPoints共线模式识别(99分)--总结及代码

2.Coursera Algorithms Programming Assignment 3: Pattern Recognition (100分)

Algorithms : Programming Assignment 3: Pattern Recognition的更多相关文章

  1. Coursera Algorithms Programming Assignment 3: Pattern Recognition (100分)

    题目原文详见http://coursera.cs.princeton.edu/algs4/assignments/collinear.html 程序的主要目的是寻找n个points中的line seg ...

  2. Programming Assignment 3: Pattern Recognition

    编程作业三 作业链接:Pattern Recognition & Checklist 我的代码:BruteCollinearPoints.java & FastCollinearPoi ...

  3. Coursera Algorithms Programming Assignment 5: Kd-Trees (98分)

    题目地址:http://coursera.cs.princeton.edu/algs4/assignments/kdtree.html 分析: Brute-force implementation. ...

  4. Coursera Algorithms Programming Assignment 4: 8 Puzzle (100分)

    题目原文:http://coursera.cs.princeton.edu/algs4/assignments/8puzzle.html 题目要求:设计一个程序解决8 puzzle问题以及该问题的推广 ...

  5. Coursera Algorithms Programming Assignment 2: Deque and Randomized Queue (100分)

    作业原文:http://coursera.cs.princeton.edu/algs4/assignments/queues.html 这次作业与第一周作业相比,稍微简单一些.有三个编程练习:双端队列 ...

  6. Coursera Algorithms Programming Assignment 1: Percolation(100分)

    题目来源http://coursera.cs.princeton.edu/algs4/assignments/percolation.html 作业分为两部分:建立模型和仿真实验. 最关键的部分就是建 ...

  7. Algorithms: Design and Analysis, Part 1 - Programming Assignment #1

    自我总结: 1.编程的思维不够,虽然分析有哪些需要的函数,但是不能比较好的汇总整合 2.写代码能力,容易挫败感,经常有bug,很烦心,耐心不够好 题目: In this programming ass ...

  8. Pattern Recognition and Machine Learning-02-1.0-Introduction

    Introduction The problem of searching for patterns in data is a fundamental one and has a long and s ...

  9. Pattern Recognition and Machine Learning-01-Preface

    Preface Pattern recognition has its origins in engineering, whereas machine learning grew out of com ...

随机推荐

  1. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  2. viewpager 跳转到指定页面

    viewPager.setCurrentItem(getUserIndex(userId)); seCurrentItem是定位到指定页面参数是position

  3. Android.mk: recipe commences before first target. Stop.

    [GUIDE] Setup Android Development Environment on Ubuntu 14.04 Trusty Tahr Hi All, This originally wa ...

  4. Django中的模板和分页

    模板 在Templates中添加母版: - 母版...html 母版(master.html)中可变化的地方加入: {%block content%}{%endblock%} 在子版 (usermg. ...

  5. 图像处理之opencv---mat、cvmat、IplImage之间的转换

    一.Mat类型:矩阵类型,Matrix.  在openCV中,Mat是一个多维的密集数据数组.可以用来处理向量和矩阵.图像.直方图等等常见的多维数据. Mat有3个重要的方法: 1.Mat mat = ...

  6. EasyDarwin开源流媒体云平台之EasyRMS录播服务器功能设计

    需求背景 EasyDarwin开发团队维护EasyDarwin开源流媒体服务器也已经很多年了,之前也陆陆续续尝试过很多种服务端录像的方案,有:在EasyDarwin中直接解析收到的RTP包,重新组包录 ...

  7. Spring整合Struts2的方法

    一.基本支持 通常我们整合Spring和struts2的目的是让Spring来管理struts2的控制器.也就是说把Action交由Spring来管理,利用IOC的特性把Action注入到业务逻辑中. ...

  8. 在Qt中使用大漠插件

    因工作需要,项目需求(要编写一个营销软件,其中一个功能是控制QQ和微信发送广告消息给指定的联系人或群组, 因为我Windows和逆向水平还不到家,起初的调用Windows API的设计方案不可行,于是 ...

  9. git基本操作---持续更新(2017-08-11)

    git 强制push $ git push -u origin master -f 查看本地标签 $ git tag 打标签并添加备注 $ git tag 20170811 -m"图片保存多 ...

  10. javascript Date对象的介绍及linux时间戳如何在javascript中转化成标准时间格式

    1.Date对象介绍 Date对象具有多种构造函数.new Date()new Date(milliseconds)new Date(datestring)new Date(year, month)n ...