作业地址:http://coursera.cs.princeton.edu/algs4/assignments/kdtree.html

作业难点:

1、如何构建KdTree,使用什么样的数据结构?

根据作业提示:

    private static class KdNode {
private Point2D point;
private boolean direction;
private RectHV rect;
private KdNode lb, rt;
KdNode(Point2D p, boolean drct) {
if (p == null)
throw new NullPointerException();
direction = drct;
point = p;
rect = null;
lb = null;
rt = null;
}
}

2、draw()怎么实现感觉不会觉得很别扭?

建一个迭代器可以遍历整个KdTee,这里使用前序遍历。

    private Iterable<KdNode> kdnodes()
{
Queue<KdNode> kNodes = new Queue<KdNode>();
preorder(kdt, kNodes);
return kNodes;
}
private void preorder(KdNode root, Queue<KdNode> q) {
if (root == null) return;
q.enqueue(root);
preorder(root.lb, q);
preorder(root.rt, q);
}

3、如何回溯最优解,是否需要parent指针?

递归深入,无需parent指针。

容易扣分点:

1、insert()重复建Rect;

2、nearest()空指针溢出。

部分代码参考:

nearest():

    public Point2D nearest(Point2D p)
{
if (p == null)
throw new NullPointerException();
if (kdt != null)
return nearPoint(kdt, p, kdt).point;
return null;
}
private KdNode nearPoint(KdNode kd, Point2D p, KdNode q) {
if (kd == null) return q;
double nrDist = p.distanceSquaredTo(q.point);
double kdDist = p.distanceSquaredTo(kd.point);
if (nrDist >= kdDist ||
nrDist >= kd.rect.distanceSquaredTo(p))
{
if (nrDist > kdDist) q = kd;
if (kd.direction) {
double cmpX = p.x() - kd.point.x();
if (cmpX < 0.0) {
if (kd.lb != null) q = nearPoint(kd.lb, p, q);
if (kd.rt != null) q = nearPoint(kd.rt, p, q);
} else {
if (kd.rt != null) q = nearPoint(kd.rt, p, q);
if (kd.lb != null) q = nearPoint(kd.lb, p, q);
}
} else {
double cmpY = p.y() - kd.point.y();
if (cmpY < 0.0) {
if (kd.lb != null) q = nearPoint(kd.lb, p, q);
if (kd.rt != null) q = nearPoint(kd.rt, p, q);
} else {
if (kd.rt != null) q = nearPoint(kd.rt, p, q);
if (kd.lb != null) q = nearPoint(kd.lb, p, q);
}
}
}
return q;
}

普林斯顿算法课第五周作业_KdTree的更多相关文章

  1. coursera普林斯顿算法课part1里Programming Assignment 2最后的extra challenge

    先附上challenge要求: 博主最近在刷coursera普林斯顿大学算法课part1部分的作业,Programming Assignment2最后的这个extra challenge当初想了一段时 ...

  2. 2018-2019-1 20189221《Linux内核原理与分析》第五周作业

    2018-2019-1 20189221<Linux内核原理与分析>第五周作业 实验四 实验过程 当用户态进程调用一个系统调用时,cpu切换到内核态并开始执行一个内核函数. 在Linux中 ...

  3. 2017-2018-1 JaWorld 第四、五周作业

    2017-2018-1 JaWorld 第四.五周作业 两周工作内容 小组讨论并确定最终的app雏形 合作完成需求说明书 工作分工 成员 分工 比例 陈是奇 1.引言 8% 马平川 2.1-2.5 产 ...

  4. 2017-2018-1 JAVA实验站 第四、五周作业

    2017-2018-1 JAVA实验站 第四.五周作业 JAVA实验站小组成员 学号 名字 职务 20162318 张泰毓 组长 20162303 石亚鑫 组员 20162304 张浩林 组员 201 ...

  5. 2017-2018-1 20179205《Linux内核原理与设计》第五周作业

    <Linux内核原理与设计>第五周作业 视频学习及操作分析 一.用户态.内核态和中断 内核态在CPU执行中对应高执行级别,执行级别为0级,具有特权指令,可以访问任意物理地址:用户态执行级别 ...

  6. 第五周作业:markdown语法小总结

    第五周作业 markdown语法总结 早就想写这么一个文章了,关于markdown的语法,因为最近使用的比较多,所以特地总结一下 一,标题 首先要介绍的就是标题, 标题一共有六级 # h1 ## h2 ...

  7. 2019-2020-1 20199329《Linux内核原理与分析》第五周作业

    <Linux内核原理与分析>第五周作业 一.上周问题总结: 虚拟机将c文件汇编成汇编文件时忘记添加include<stdio.h> gdb跟踪汇编过程不熟练 二.本周学习内容: ...

  8. Java实现 蓝桥杯 算法训练 第五次作业:字符串排序

    试题 算法训练 第五次作业:字符串排序 问题描述 输入一个小写字符串,按从小到大的顺序输出. 输入格式 bcaed 输出格式 abcde 顶格输出,中间没有空格 样例输入 一个满足题目要求的输入范例. ...

  9. 2019春第五周作业Compile Summarize

    这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能够精通关于数组内部运作原理 这个作业在哪个具体方面帮助我实现目标 如何输出一行的连续字符 参考文献与网址 ...

随机推荐

  1. textarea元素只设置高可变,宽固定

    网上查了一下多数只告诉怎么禁止拖动,好在编辑器提示了所有的属性,在此记录一下 textarea{ resize: vertical; } 还有其它的属性

  2. HTML5-本地存储与cookies

    一.H5的几种存储形式 1.本地存储(localstorage和sessionstorage) 存储形式:key-->value 过期策略:localstorage永久存储,不过期,除非手动删除 ...

  3. (转)实现DataList的分页 新增列

    前几天在做网上商城,要展示商品信息(有图片,有文字),DataView虽然可以分页,但它的缺点是不能自定义显示格式.而DataList解决了它的缺点,但DataList本身却不能分页.很是头痛,于是在 ...

  4. 在CentOS 7 中 安装 VSFTP

    在线安装:yum install -y vsftpd 使用yum 进行卸载:yum -y remove vsftpd 编辑配置:vi /etc/vsftpd/vsftpd.conf 查看FTP进程是否 ...

  5. winserver 08 64位安装sql05 64位提示asp版本注册

    将打开 安装IIS 6.0的就可以了,然后重启下

  6. SpringMVC文件上传和下载

    上传与下载 1文件上传 1.1加入jar包 文件上传需要依赖的jar包 1.2配置部件解析器 解析二进制流数据. <?xml version="1.0" encoding=& ...

  7. sql 如何将拼的sql语句结果赋值给变量

    SET @SQLS='select @AllUser=count(1) from (select PhoneId from '+@TABLE+' where SiteId='+convert(VARC ...

  8. angularjs 设置全局变量的3种方法

    angularjs自身有二种,设置全局变量的方法,在加上js的设置全局变量的方法,总共有三种.要实现的功能是,在ng-app中定义的全局变量,在不同的ng-controller里都可以使用. 1,通过 ...

  9. OOP的四个魔术方法

    1 __autoload()自动包含类文件 通常会把类的定义单独写到一个文件里,要在另外的文件调用时需要引用require,但类的定义文件会很多就会造成一下问题 //1 如果包含多个类文件,需要一一引 ...

  10. postgresql 设置只读用户

    postgresql 设置只读用户 ` CREATE USER readonly WITH ENCRYPTED PASSWORD 'ropass'; alter user readonly set d ...