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. quick-cocos2d-x教程12:实现文本和password输入界面

    用户输入账号和password输入是常见工能,如今用editbox来实现username和password输入.可是这个商业项目上常见功能,网上却没有找到教程.我就一步一步的实现.代码例如以下: fu ...

  2. remote connect openshift mysql

    再虚拟机内 rhc port-forward <app-name> 此时,可以在本机 访问 127.0.0.1:8080  登陆 网页, 3306连接sql https://unix.st ...

  3. 理解DOMSTRING、DOCUMENT、FORMDATA、BLOB、FILE、ARRAYBUFFER数据类型

    一.XMLHttpRequest 2.0的家臣们 我大学那会儿,一个称为Ajax的东西对前端行业造成了深远影响,不仅是JS语言,而包括前端地位.职位兴起以及工作分工等.抛开IE6浏览器不谈,其他浏览器 ...

  4. python发送post请求上传文件,无法解析上传的文件

    前言 近日,在做接口测试时遇到一个奇葩的问题. 使用post请求直接通过接口上传文件,无法识别文件. 遇到的问题 以下是抓包得到的信息: 以上请求是通过Postman直接发送请求的. 在这里可以看到消 ...

  5. EasyDarwin手机直播是如何实现的快速显示视频的方法

    前言 经常有人提到最近比较火的映客直播.花椒直播这种,是如何做到在打开手机直播中的某一个主播房间后,立即就能显示出主播视频,非常非常快,而且延时也比较小,是怎么做到的? 其实,这并不是什么高深的技术, ...

  6. 记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案(转)

    问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...

  7. 11、JavaScript 比较和逻辑运算符

  8. win7和win2008 r2下配置IIS7(ASP.net运行环境)

    win7和win2008 r2下配置IIS7(ASP.net运行环境) 1.先要设置应用程序池(ApplicationPool)为Classic.NETAppPool,而不是默认的DefaultApp ...

  9. Flyweight Pattern

    1.Flyweight 模式以共享的方式高效的支持大量的细粒度对象,对象分为内部状态.外部状态.将可以被共享的状态作为内部状态存储在对象中,而外部状态在适当的时候作为参数传递给对象. 当以下所有的条件 ...

  10. C++ ini解析器

    在gitee上找到的一个很好用的ini文件解析器,纯C++代码,移植方便. 项目地址:https://gitee.com/sollyu/IniParser 稍微修改了下,去掉了Windows平台相关定 ...