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. ubuntu 下的中文输入法的安装和配置- ibus

    ibus输入法 Chinese语言包安装 首先需要给Ubuntu16.04安装Chinese语言包支持.  如上图点击其中的Install/Remove Languages…,这个对话框是通过syst ...

  2. 在Linux的Eclipse下搭建Android环境

    http://blog.csdn.net/lyonte/article/details/6407242 一.Java环境安装配置详见<在Linux下搭建Java环境>http://blog ...

  3. 微信小程序 如何使用globalData

    微信小程序在JavaScript文件中声明的变量和函数只在该文件中有效:不同的文件中可以声明相同名字的变量和函数,不会互相影响.如果希望在各个页面之间共同使用某些信息,并且可以对共享数据进行修改设置, ...

  4. [省选]板块(shenben已经AFO!!!)

    shenben已经AFO!!! 部分摘抄自网络 同样的,加粗是重点,星号是选学 图论 网络流(dinic,ISAP选一个,费用流写EK就行.*zkw费用流),二分图 点分治,边分治,*动态点分治 树链 ...

  5. asp.net mvc4 修改密码界面

    1.效果 说明:1.界面不太美观 这里面主要是包括 利用jQuery 插件validate验证form字段,jQuery提交form表单的方式 1.HTML代码 <!DOCTYPE html&g ...

  6. UIView封装动画--iOS利用系统提供方法来做转场动画

    UIView封装动画--iOS利用系统提供方法来做转场动画 UIViewAnimationOptions option; if (isNext) { option=UIViewAnimationOpt ...

  7. (linux)struct inode 和 struct file

    转自:http://www.cnblogs.com/QJohnson/archive/2011/06/24/2089414.html 1.struct inode──字符设备驱动相关的重要结构介绍 内 ...

  8. java to Json or Json to JavaBean

    今天练习,放这里,以后再补充 这里使用的jar包是 net.sf.json.JSONObject package yh.test.t1118; import net.sf.json.JSONArray ...

  9. UVA11551 Experienced Endeavour —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/UVA-11551 题意: 给定一列数,每个数对应一个变换,变换为原先数列一些位置相加起来的和,问r次变换后的序列是多少 题解: 构造矩 ...

  10. Codeforces Round #222 (Div. 1) Maze —— dfs(连通块)

    题目链接:http://codeforces.com/problemset/problem/377/A 题解: 有tot个空格(输入时统计),把其中k个空格变为wall,问怎么变才能使得剩下的空格依然 ...