作业地址: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. mysqldump数据库同步遇到的问题

    1.同步数据是遇到 没有 lock database权限,报 " mysqldump: Got error: 1044: Access denied for user 'spider_dat ...

  2. 【codevs1282】约瑟夫问题

    题目描述 有编号从1到N的N个小朋友在玩一种出圈的游戏.开始时N个小朋友围成一圈,编号为I+1的小朋友站在编号为I小朋友左边.编号为1的小朋友站在编号为N的小朋友左边.首先编号为1的小朋友开始报数,接 ...

  3. H5案例分享:JS手势框架 —— Hammer.js

    JS手势框架 -- Hammer.js 一.hammer.js简介 hammerJS是一个开源的,轻量级的触屏设备javascript手势库,它可以在不需要依赖其他东西的情况下识别触摸,鼠标事件.允许 ...

  4. Windows Defender无法开启问题

    针对Win8及以上系统: 按Win+R键,输入services.msc,下滑找到以W开头的Windows Defender相关项,右键在属性中设为自动并开启. (若1无法解决)按Win+R键,输入re ...

  5. Mac 编写oracle 连接脚本

    首先需要本地存有sqlplus命令, 如果没有则需要到官网下载 也可点击我进行下载 (解压 readme.txt 有安装配置说明): 在Oracle官网下载instant client for os ...

  6. CSS样式表基础

    CSS的样式表其实就是美观页面的,加一些样式. 一.样式表的三种分类: ①内联样式:写在某一个标签里面的样式. 优点:控制精确. 缺点:代码重用性差.(太多了不好写)页面代码乱.(太乱,后期不方便看) ...

  7. Webbench性能测试

    1.下载安装:立即下载  官网:http://home.tiscali.cz/~cz210552/webbench.html 2.解压缩:tar -zxvf webbench-1.5.tar.gz 3 ...

  8. C 标准库系列之概述

    基本上很多编程语言都会提供针对语言本身的一系列的标准库或者包,当然C语言同样也有提供标准库,C语言的标准库是一系列的头文件的集合:如assert.h.ctype.h.errno.h.float.h.l ...

  9. win7(x64)下安装cocos2d并编译安卓项目

    好吧,不为啥,就是如题. win7 x64 脑袋内存比较小,说不定明儿就忘了,今天记录一下. 没有什么经验,所有步骤基本都是百度出来的,这里边操作边记录,为了保护原创作者,这里我都附上我查找的链接. ...

  10. 再谈缓存和Redis

    自从上次分享<Redis到底该如何利用?>已经有1年多了,这1年经历了不少.从码了我们网站的第一行开始到现在,我们的缓存模块也不断在升级,这之中确实略有心得,最近也有朋友探讨缓存,觉得可以 ...