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 ...
随机推荐
- MFS分布式存储特性及组件说明
1.MFS MooseFS是一个具有冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本,然而对于访问MFS的客户端或者用户来说,整个分布式 ...
- JS中报错处理 try catch finally的使用
JS中标准报错处理通过 try catch finally ,使用格式 try { } catch (err) { } finally { } 代码1: try { console.log('顺序 1 ...
- webservice学习随笔(二):通过cxf实现webservice
一:基本概念(可跳过) Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基 ...
- idea中执行“npm/yarn”命令,提示'node/yarn' 不是内部或外部命令,也不是可运行的程序
问题:idea中执行"npm/yarn"命令,提示'node/yarn' 不是内部或外部命令,也不是可运行的程序.但是在本地打开cmd 是可以运行npm/yarn命令的 解决方法: ...
- Javaweb学习第十二弹--Request和Response
XML配置方式编写Servlet 3.0版本之前,仅仅支持XML配置文件的配置方式 1.编写Servlet类 2.在web.xml中配置该Servlet Request和Response Reques ...
- 全网最详细中英文ChatGPT-GPT-4示例文档-从0到1快速入门解析非结构化数据应用——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)
目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...
- webgl 系列 —— 着色器语言
其他章节请看: webgl 系列 着色器语言 本篇开始学习着色器语言 -- GLSL全称是 Graphics Library Shader Language (图形库着色器语言) GLSL 是一门独立 ...
- 柏林噪声算法(Perlin Noise)
概述 引述维基百科的介绍: Perlin噪声(Perlin noise,又称为柏林噪声)指由Ken Perlin发明的自然噪声生成算法,具有在函数上的连续性,并可在多次调用时给出一致的数值. 在电子游 ...
- opencv-python 4.9.2. 轮廓特征
矩 图像的矩可帮助你计算某些特征,如对象的质心,对象的面积等特征.函数cv.moments()给出了计算的所有矩值的字典. 从这一刻起,你可以提取有用的数据,如面积,质心等.质心由关系给出, $$ C ...
- DataLeap 数据资产实战:如何实现存储优化?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 背景 DataLeap 作为一站式数据中台套件,汇集了字节内部多年积累的数据集成.开发.运维.治理.资产.安全等全 ...