二维平面的欧几里得距离

简介: 二维平面的欧几里得距离

二维平面p和q两点间的欧几里得距离公式:

如果对于二维平面上任意多个点,例如:


要找出欧式距离最短的两个点,要如何求解?

  • 暴力方式
双重循环:
for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      currMin = dist(P[i], P[j]);
      if (currMin < min) {
        min = currMin;
      }
    }
 }
  • 按某一方向排序,然后化作一维的方式进行比较


import java.util.*;
import java.util.List;
public class Kata { 
    // 计算欧式距离 
    public static float dist(Point p1, Point p2) {    
        return (float) Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) +                             
        (p1.y - p2.y) * (p1.y - p2.y));  
    }    
    public static List<Point> closestPair(List<Point> points) {
        int left = 0;
        int right = 0;    
        float min = Float.MAX_VALUE;    
        // 按Y轴方向排序,自定义排序方法;    
     Collections.sort(points, new Comparator<Point>(){      
        @Override      
        public int compare(Point u1, Point u2) {        
          double diff = u1.y - u2.y;        
          if (diff > 0) {          
              return 1;        
          }else if (diff < 0) {          
              return -1;        
          }        
           return 0;       
         }
       });      
       // x轴方向依次比较,     
       //(points.get(j).y - points.get(i).y) < min 确保不会比较的次数太多      
      for (int i = 0; i < points.size(); ++i) {        
          for (int j = i + 1; j < points.size() && (points.get(j).y - points.get(i).y) < min; ++j) {
              if (dist(points.get(i), points.get(j)) < min) {        
                  min = dist(points.get(i), points.get(j));            
                  left = i;            
                  right = j;          
                  }        
               }  
           }        
       return Arrays.asList(points.get(left),points.get(right));  
       }
    }

虽然看似是O(n^2)的复杂度,但是由于另一个方向的比较次数不会太多,最终的复杂度是比暴力要小很多的。


相关文章
|
前端开发 JavaScript UED
前端性能的性能指标之首次内容绘制(FCP)
首次内容绘制(First Content Paint)是前端性能的一个重要指标,因为它是用户体验的一部分,并且对于网页的响应速度和可接受性有很大的影响。
607 0
|
DataX
vue3实现列表搜索功能
vue3实现列表搜索功能
520 0
|
网络协议 Linux C语言
linux下CC++网络编程基本:socket实现tcp和udp的例子
linux下CC++网络编程基本:socket实现tcp和udp的例子
487 0
|
运维 Oracle 容灾
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
|
机器学习/深度学习 缓存 Linux
python环境学习:pip介绍,pip 和 conda的区别和联系。哪个更好使用?pip创建虚拟环境并解释venv模块,pip的常用命令,conda的常用命令。
本文介绍了Python的包管理工具pip和环境管理器conda的区别与联系。pip主要用于安装和管理Python包,而conda不仅管理Python包,还能管理其他语言的包,并提供强大的环境管理功能。文章还讨论了pip创建虚拟环境的方法,以及pip和conda的常用命令。作者推荐使用conda安装科学计算和数据分析包,而pip则用于安装无法通过conda获取的包。
1566 0
|
机器学习/深度学习 人工智能 监控
自动化测试中AI的崛起:未来趋势与挑战
【7月更文挑战第25天】本文旨在探究人工智能在自动化测试领域的应用及其带来的变革。通过分析AI技术如何优化测试流程、提高测试效率和准确性,我们将深入理解这一技术革新背后的意义。同时,文章也将讨论AI自动化测试面临的挑战和未来的发展趋势,为读者提供一个关于软件测试未来方向的全面视角。
|
存储 Linux
在Linux中,如何管理磁盘配额?
在Linux中,如何管理磁盘配额?
|
编译器 C语言
C语言:typedef 和 define 有什么区别
在C语言中,`typedef`和`#define`都是用来创建标识符以简化复杂数据类型或常量的使用,但它们之间存在本质的区别。`typedef`用于定义新的数据类型别名,它保留了数据类型的特性但不分配内存。而`#define`是预处理器指令,用于定义宏替换,既可用于定义常量,也可用于简单的文本替换,但在编译前进行,过度使用可能导致代码可读性下降。正确选择使用`typedef`或`#define`可以提高代码质量和可维护性。
|
Linux
linux播放器
Linux系统提供多种音乐和视频播放器,如Iceplayer(原Splayer),支持多种音频格式及丰富功能,被誉为Linux版千千静听;Amarok是KDE桌面的强大音乐播放器;Rhythmbox是GNOME的默认播放器,简洁实用;Clementine是跨平台且源自Amarok 1.4的播放器;VLC是跨平台的强大播放器,支持众多音频和视频格式;Audacious则是一款简约轻便的播放器,适合喜欢Winamp风格的用户。每款播放器都有其特色,用户可根据需求选择。
383 3
linux播放器
|
Oracle 关系型数据库 MySQL
关于MySQL的分区索引
前段时间有同事问MySQL 分区索引是全局索引还是本地索引。全局索引和本地索引是Oracle的功能,MySQL(包括PostgreSQL)只实现了本地索引,并且因为有全局约束的问题,MySQL分区表明确不支持外键,并且主键和唯一键必须要包含所有分区列,否则报错。
6357 1