作业地址: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. EBS中利用Socket与外系统通信

    某银行要求做一个签到签退功能,日终EBS系统发送报文与核心系统对帐,规定利用Socket来做传送,记录下步骤: 1.编辑: $INST_TOP/ora/10.1.3/j2ee/oacore/appli ...

  2. 为什么Java不适合游戏开发

    Strawberry Cow Bear: why java sucks for game developmenthttp://strawberrycowbear.blogspot.jp/2011/02 ...

  3. Qt - 错误总结 - 在自定义类头文件中添加Q_OBJECT 编译时报错(undefined reference to ‘vtable for xxThread)

    错误提示:在添加的QThread子类头文件添加Q_OBJECT时,编译程序,出现"undefined reference to 'vtable for xxThread'"错误提示 ...

  4. C#实现快速排序

    网上很多关于快速排序的教程,嗯,不错,版本也很多,有的试了一下还报错..呵呵 于是乎低智商的朕花了好几天废了8张草稿纸才弄明白.. 快速排序的采用的分治啊挖坑填数啊之类的网上到处都是,具体过程自己百度 ...

  5. 【Winform】使用BackgroundWorker控制进度条显示进度

    许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...

  6. Gcc的Makefile简单使用

    Gcc的Makefile简单使用http://blog.chinaunix.net/uid-9330295-id-2425867.html

  7. WPF获取应用程序启动目录的方法

    1.AppDomain.CurrentDomain.BaseDirectory using System; namespace ConsoleApplication1 { class Program ...

  8. string类型转换int类型

    C++转换形式(C++11): int main(int argc, char* argv[]) { std::"; std::string str2 = "3.14159&quo ...

  9. From 202.97.60.193 icmp_seq=48 Time to live exceeded

    从浙江某电信ip的服务器上 ping 大陆外某个外网地址不通,报如下信息: From 202.97.60.193 icmp_seq=48 Time to live exceeded google,百度 ...

  10. extern "c"用法解析

    转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言, ...