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 ...
随机推荐
- Docker安装:Centos7.6安装Docker
Docker03:Centos7.6安装Docker 前提条件 内核版本 更新yum 包 卸载旧版本(如果安装过旧版本的话) 安装依赖包 设置yum源(阿里云源) 更新缓存 安装容器 启动并加入开机启 ...
- jacoco插件添加
1.添加依赖 <dependency> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-p ...
- Windows 任务栏透明 居中
任务栏设置 任务栏居中 由于windows默认的程序是从左往右显示,看着可能有一点不舒服,当然如果使用习惯的话,忽然居中,可能更不舒服 首先搜索字符映射表 点击字符映设表中第五行的空白字符,选择进行复 ...
- Apk_动态调试方案
环境准备 安装夜神安卓模拟器 配置好adb[Android 调试桥]环境(这里需要使用官方的adb环境,设置好环境变量)Android 调试桥 (adb) | Android 开发者 | Androi ...
- 标准C语言32个关键字
数据类型相关: 内建类型: char short int long void float double 7 自建类型: struct ...
- 干货 | BitSail Connector 开发详解系列一:Source
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 BitSail 是字节跳动自研的数据集成产品,支持多种异构数据源间的数据同步,并提供离线.实时.全量.增量场景下全 ...
- Java程序死锁问题定位与解决
更多内容,前往 IT-BLOG 一.概述 死锁是指两个或两个以上的进程在执行过程中,因争抢资源而造成的一种互相等待的现象,若无外力干涉它们将无法推进,如果系统资源充足,进程的资源请求能够得到满足,死锁 ...
- 修改host文件
host文件路径 Windows 系统:C:\Windows\System32\drivers\etc\hosts Linux 系统:/etc/hosts Mac(苹果电脑)系统:/etc/hosts ...
- Go语言实现TCP通信
TCP协议为传输控制协议,TCP协议有以下几个特点:1. TCP是面向连接的传输层协议:2. 每条TCP连接只能有两个端点,每条TCP连接是点到点的通信:3. TCP提供可靠的交付服务,保证传送的数据 ...
- 最新版本 Stable Diffusion 开源 AI 绘画工具之使用篇
目录 界面参数 采样器 文生图(txt2img) 图生图(img2img) 模型下载 界面参数 在使用 Stable Diffusion 开源 AI 绘画之前,需要了解一下绘画的界面和一些参数的意义 ...