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. at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:)

    错误提示 错误原因 參考链接 错误提示: at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:) 在Andro ...

  2. VueJS处理逻辑指令:v-if

    HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  3. QC3.0快充技术详解

    QC3.0 智能手机的电池容量愈来愈大,除了省电能力外,充电速度更成为用户愈来愈重视的特点.高通(Qualcomm)的 Quick Charge 快充技术已成为业界的典范之一,继 Quick Char ...

  4. javascript 高级编程系列 - 创建对象

    1. 工厂模式 function createPerson(name, age) { var obj = {}; obj.name = name; obj.age = age; obj.getName ...

  5. 使用".."指定git提交范围与"..."指定git提交范围的区别

    http://blog.csdn.net/hansel/article/details/8952967 使用".."(两个点)和"..."(三个点)都可以指定一 ...

  6. 小贝_mysql主从复制作用以及案例

    mysql主从复制 简要: 一.mysql用户授权 二.mysql bin-log日志 三.mysql主从复制   一.mysql用户授权 1.命令 2.作用:进行权限控制 3.样例: (备注: 同意 ...

  7. 怎样高速编译mediatek\operator以下代码

    mediatek\operator以下有单独的apk.也有overlay的数据,单独的apk会配置anroid.mk,找到相应的路径直接build. 假设是overlay,则编译原来应用的路径,比如 ...

  8. Python之Pandas库常用函数大全(含注释)

    前言:本博文摘抄自中国慕课大学上的课程<Python数据分析与展示>,推荐刚入门的同学去学习,这是非常好的入门视频. 继续一个新的库,Pandas库.Pandas库围绕Series类型和D ...

  9. Java中的枚举类为何不能有public构造器

    声明:本博客为原创博客.未经同意.不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/27262809. 从Java 5開始有了枚举类, ...

  10. SAM4E单片机之旅——10、UART与MCK之PLL

    为使用更更高的波特率,则需要更更高的外设时钟的频率.这个时候就需要用到锁相环(PLL)了.锁相环可以对输入的时钟进行分频.升频后进行输出.MCK可以使用的锁相环为PLLA,而PLLA的输入时钟为MAI ...