2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 返回最短距离,精确到小数点后面4位。
2022-11-06:给定平面上n个点,x和y坐标都是整数,
找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。
返回最短距离,精确到小数点后面4位。
答案2022-11-06:
暴力法是的复杂度是O(N**2)。
跟归并排序类似。T(N) = 2T(N/2) + O(N)。网上很多算法的复杂度是O(N(logN)的平方)。
时间复杂度:O(N*logN)。
代码用rust编写。代码如下:
use std::iter::repeat;
fn main() {
unsafe {
let input: [i32; 7] = [3, 1, 1, 1, 2, 2, 2];
let mut input_index = 0;
let n = input[input_index];
// N = n as usize;
input_index += 1;
points = repeat(Point::new(0.0, 0.0)).take(n as usize).collect();
merge = repeat(Point::new(0.0, 0.0)).take(n as usize).collect();
deals = repeat(Point::new(0.0, 0.0)).take(n as usize).collect();
for i in 0..n {
let x = input[input_index];
input_index += 1;
let y = input[input_index];
input_index += 1;
points[i as usize].x = x as f64;
points[i as usize].y = y as f64;
}
points.sort_by(|a, b| {
if a.x <= b.x {
core::cmp::Ordering::Less
} else {
core::cmp::Ordering::Greater
}
});
let ans = nearest(0, n - 1);
println!("{:.4}", ans);
}
}
static mut points: Vec<Point> = vec![];
static mut merge: Vec<Point> = vec![];
static mut deals: Vec<Point> = vec![];
#[derive(Debug, Copy, Clone)]
struct Point {
x: f64,
y: f64,
}
impl Point {
fn new(a: f64, b: f64) -> Self {
Self { x: a, y: b }
}
}
fn nearest(left: i32, right: i32) -> f64 {
unsafe {
let mut ans = f64::MAX;
if (left == right) {
return ans;
}
let mut mid = (right + left) / 2;
let mid_x = points[mid as usize].x;
ans = get_min(nearest(left, mid), nearest(mid + 1, right));
let mut p1 = left;
let mut p2 = mid + 1;
let mut merge_size = left;
let mut deal_size = 0;
while (p1 <= mid && p2 <= right) {
if points[p1 as usize].y <= points[p2 as usize].y {
merge[merge_size as usize] = points[p1 as usize];
p1 += 1;
} else {
merge[merge_size as usize] = points[p2 as usize];
p2 += 1;
}
if (f64::abs(merge[merge_size as usize].x - mid_x) <= ans) {
deals[deal_size as usize] = merge[merge_size as usize];
deal_size += 1;
}
merge_size += 1;
}
while (p1 <= mid) {
merge[merge_size as usize] = points[p1 as usize];
p1 += 1;
if (f64::abs(merge[merge_size as usize].x - mid_x) <= ans) {
deals[deal_size as usize] = merge[merge_size as usize];
deal_size += 1;
}
merge_size += 1;
}
while (p2 <= right) {
merge[merge_size as usize] = points[p2 as usize];
p2 += 1;
if (f64::abs(merge[merge_size as usize].x - mid_x) <= ans) {
deals[deal_size as usize] = merge[merge_size as usize];
deal_size += 1;
}
merge_size += 1;
}
for i in left..=right {
points[i as usize] = merge[i as usize];
}
for i in 0..deal_size {
for j in i + 1..deal_size {
if (deals[j as usize].y - deals[i as usize].y >= ans) {
break;
}
ans = get_min(
ans,
distance(&mut deals[i as usize], &mut deals[j as usize]),
);
}
}
return ans;
}
}
fn distance(a: &mut Point, b: &mut Point) -> f64 {
let x = a.x - b.x;
let y = a.y - b.y;
return f64::sqrt(x * x + y * y);
}
fn get_max<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a > b {
a
} else {
b
}
}
fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {
if a < b {
a
} else {
b
}
}
执行结果如下:

2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 返回最短距离,精确到小数点后面4位。的更多相关文章
- 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M. 需要选出若干个x,使这几个x的和与 M 最接近. 请描述实现算法,并指出算法复杂度. #define M 8 ...
- 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况
用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...
- 前端算法题:找出数组中第k大的数字出现多少次
题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...
- 海量数据中找出前k大数(topk问题)
海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...
- 从长度为 M 的无序数组中,找出N个最小的数
从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK ...
- 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
/** * 功能:给定一个排序后的数组.包括n个整数.但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 能够假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组 ...
- ML 07、机器学习中的距离度量
机器学习算法 原理.实现与实践 —— 距离的度量 声明:本篇文章内容大部分转载于July于CSDN的文章:从K近邻算法.距离度量谈到KD树.SIFT+BBF算法,对内容格式与公式进行了重新整理.同时, ...
- [转] MachingLearning中的距离相似性计算以及python实现
参考:https://blog.csdn.net/gamer_gyt/article/details/75165842#t16 https://blog.csdn.net/ymlgrss/artic ...
- c语言求平面上2个坐标点的直线距离、求俩坐标直线距离作为半径的圆的面积、递归、菲波那次数列、explode
#include <stdio.h> #include <math.h> #include <string.h> char explode( char * str ...
随机推荐
- 前端小白启动开源框架vue-element
开发java的我按耐不住想学前端的冲动不想看培训机构的视频,决定自学遇到那种"前端知识图谱"的知识架构,看一眼就完了,不能拿来做入门用入门就得是先把工作环境搭起来,能出活就ok了 ...
- 制作可以显示GIF动图的activeX 控件
因为工作需要,我需要一个可以显示gif 动图的控件,用来在VBS中显示动图,结果找了半天发现根本没有这样的控件,所以只能搜集资料自己来制作一个. 下面记录一下步骤: 1. 下载 PictureEx.h ...
- 问道Golang,6月龄必知必会(二)
在我看来,golnag有许多反直观的设计,而且这些设计通常不能自圆其说,导致gohper一而再再而三的调入陷阱. 网上也有很多gohper总结了一些笔记,我再提炼精简一下,挂在脑图树上便于记忆. 值类 ...
- Android studio 安装过程中SDK的环境配置问题
SDK的环境配置问题 在之前的某一篇中,我也提到过在Ecplise里面的SDK的环境配置,二者确实不太一样! 一.系统环境变量新增一个 变量名为:ANDROID_HOME 变量值为:浏览到下载SDK的 ...
- 震惊,一行MD5居然让小伙伴都回不了家!!!
作者:京东零售 付伟 1. 前言 大家好,当你点开这篇文章的时候也许心想是哪个 XX 小编混到这里,先不要着急扔臭鸡蛋,本文是一篇标准(正经)的问题复盘文章.好了,一行MD5居然让小伙伴下不了班,到底 ...
- 实践解析丨如何通过 WebAssembly 在 Web 进行实时视频人像分割
5 月 15 日,声网Agora 高级架构师高纯参加了 WebAssambly 社区举办的第一场线下活动"WebAssembly Meetup",并围绕声网Agora 在 Web ...
- 基于springboot实现SSM整合
(1)SpringBoot整合Spring(不存在) (2)SpringBoot整合SpringMVC(不存在) (3)SpringBoot整合MyBatis(主要) 一.新建springboot项目 ...
- 设计模式-用代理模式(Proxy Pattern)来拯救你的代码:打造可靠的程序设计
前言 设计模式是一种高级编程技巧,也是一种通用的解决方案.它能在不同的应用场景中使用,它可以提高代码的可读性.可复用性和可维护性.设计模式的学习能提高我们的编程能力以及代码质量,同时也能提高我们的开发 ...
- AcWing刷题记录 - 2022
AcWing 1813. 方块游戏 思路 枚举,题目说明不管哪一面向上都可以,所以就两面加起来取各个字母的最大值,最后N对字母的最大值相加就是答案 代码 #include<bits/stdc++ ...
- 中英文拼写检测纠正开源项目使用入门 word-checker 1.1.0
项目简介 word-checker 本项目用于单词拼写检查.支持英文单词拼写检测,和中文拼写检测. 特性说明 可以迅速判断当前单词是否拼写错误 可以返回最佳匹配结果 可以返回纠正匹配列表,支持指定返回 ...