两点之间最短距离

这是我的一个测试,也是我学习html的/起点,他们说一个合格的程序员必须学会html,我比他们起步晚了一些,可是我认为还来的及,以后我就用html来记录我的学习记录了。

问题的提出:
在二维平面的n个点上,找出其中的一对点,使得在n个点组成的所有的点中,该点对的距离最小。

一维:最接近点对问题

方法一:(暴力法)
  直接使用双层遍历来计算每一对点的距离,另外新建一个变量记录两点之间距离最小的值,但是如此一来时间复杂度就变为O(n2),

方法二:(分治法)
分治法的思路:

  1. 划分成子规模点集S1和S2;
  2. 找到S1和S2的最小距离d;
  3. 合并S1和S2:利用d在S1的(m-d,m]和S2(m,m+d]中找到最大点和最小点,即p3和q3.选出最小距离,完成合并。

![示意图](https://img-blog.csdnimg.cn/20201004201704741.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNTExOTY0,size_16,color_FFFFFF,t_70#pic_center)

m如何选择
m=(max(s)+min(s))/2;

代码:
talking is cheap,show me the code;

/*根据算法随便写的,返回的是两个点之间最小的距离,不是两个点的坐标,如果有问题,欢迎指正*/
/*这里的坐标默认为正序的*/
#include<iostream>
#include<vector>
using namespace std;
int search(vector<int> target)
{
int n=target.size();
if(n<2)   //如果分到一个元素就返回最大数值
return INT_MAX;
int mid=n/2;   //中线
vector<int> temp_left;  vector<int> temp_right;   temp_left.insert(temp_left.begin(),target.begin(),target.begin()+mid); //中线分割  temp_right.insert(temp_right.begin(),target.begin()+mid,target.end());  int p=search(temp_left);  int q=search(temp_right);  int d=temp_right.front()-temp_left.back();  cout<<temp_right.front()<<" "<<temp_left.back()<<endl;
return d>min(p,q)?min(p,q):d;}//返回两边和贯穿中间的最小的两点距离int main(){    int a[6]={-9,-6,0,4,7,9};    vector<int> target(a,a+6);
cout<<search(target);
return 0;
}

二维最接近点的问题:

思路与一维的最接近点对相似。

  1. 选取中垂线l:x=m来作为分割直线。
  2. 递归的在S1和S2找出其最小距离d1和d2,并设d=min{d1,d2},S中最接近点对或是d,或者是某个{p,q}
  3. 合并起来
// 随便写思路的如果有误,请指正(注意返回的是两点之间的距离,不是坐标)
#include <iostream>
#include <math.h>
#include<algorithm>
using namespace std;
struct point
{int x, y;
};
double distance(struct point p1, struct point p2)
{return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y,2));
}
double search(struct point p[],int pl,int pr)
{if (pl == pr)return INT_MAX;int mid = (pl + pr) / 2;double d_left = search(p, pl, mid);double d_right = search(p, mid + 1, pr);double temp_d = min(d_left, d_right);while (abs(p[pl].y - p[mid].y) > temp_d&&pl < pr)//如果仅仅是单边距离就已经大于上一次比较返回的d就没必要在接下来的敌方继续比较了。pl++;while (abs(p[pr].y - p[mid].y) > temp_d&&pl < pr)pr--;for (int i = pl; i < pr; i++){for (int j = i + 1; j < pr; j++){if (temp_d < abs(p[i].x - p[j].x))//同理与上面的注释break;elsetemp_d = min(temp_d, distance(p[i], p[j]));//找到最小的距离}}return temp_d;
}
int main()
{struct point p[100];int n;cin >> n;for (int i = 0; i < n; i++){cin >> p[i].x;cin >> p[i].y;}cout<<search(p, 0, n - 1);
}

C++ 两点之间最短距离相关推荐

  1. python两点之间最短距离_寻找两点之间的最短距离Python

    我有两个数据框.一个包含properties locations,另一个包含railway stations locations. 属性数据框样本(原始数据框由约700行组成): properties ...

  2. python两点之间最短距离_最短路径(图中两点间最短路径)

    packagecom.cn.datastruct;importjava.util.Scanner;//最短路径求解 public classDistMin {static classGraphMatr ...

  3. 两点之间最短距离:贪心算法 (DIJKSTRA算法)

    在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一 个A城市的交通咨询系统.在系统中采用图来构造各个城市之间的联系,图中 顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市 ...

  4. 弗洛伊德(Floyd)算法之两点之间的最短距离问题

    1.概述 (1)与迪杰斯特拉(Dijkstra)算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,该算法 名称以创始人之一.1978 年图灵奖获得者.斯坦福大学计 ...

  5. 两点之间的最短距离是?

    两点之间的最短距离是直线吗?现实告诉我们两点之间的最段距离是阻力最小的路:) "世事洞明皆学问,人情练达即文章" 转载于:https://www.cnblogs.com/Maste ...

  6. 如何求地球上两点之间的最短距离_例谈平行线上两动点之间距离最短问题

    初中几何中有一类关于距离最短的问题,这些问题最终都会转化为"垂线段最短"或"两点之间线段最短".本文就一类平行线上两动点之间距离最短问题,谈谈笔者对此的分析和见 ...

  7. Dijkstra最短路由算法,求任意两点之间的最短距离【Java】

    一.问题 求下图中节点0到节点5之间的最短距离 二.方法 Dijkstra最短路由算法.本文不再赘述,直接上代码,如果不懂,可以参考 文章 三.代码 public class MyDijkstra { ...

  8. 图:两点之间的最短距离

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 问题阐述 像 Google 地图.百度地图.高德地图这样的地图软件,如果想从家开车到公司,你只需要输 ...

  9. BFS 寻找矩阵中两点之间的最短距离

    找指定两坐标间的最短距离 这一类 找两点间最短距离的问题一般是使用BFS来解决. 题目描述 给定一个矩阵,x 为坐标起点,即可以用作出发的地方,T 为终点, 即要到达的地方,那么请给出 从 X 出发能 ...

最新文章

  1. python urllib的用法实例
  2. python中的matplotlib.pyplot_python matplotlib中axes与axis的区别?
  3. DevOps vs. Agile:它们有什么共同点?
  4. Windows7 + Nginx + Memcached + Tomcat 集群 session 共享
  5. springboot使用redis做session会话管理
  6. rea t插件 vscode_VSCode构建汇编语言环境(配置VSCode自动调用dosbox编译运行MASM/TASM程序)...
  7. 国货如此畸形,改革30年无国际品牌
  8. 图解约瑟夫环(C语言实现)
  9. Kindeditor富文本使用
  10. 红帽子linux拨号上网,centos6.5宽带拨号上网的方法
  11. std在汇编语言是什么指令_汇编语言STD CLD的用法
  12. 电子技术网站大全[转]
  13. win7打开xp共享的计算机,xp/win7局域网共享软件
  14. rust石墙掉耐久_rust恢复房子耐久 | 手游网游页游攻略大全
  15. 一文简要了解词义消歧与实体消歧
  16. 项目开发之微信支付接口调用
  17. webpack 报错处理 Error: Cannot find module '@webassemblyjs/wast-parser'
  18. 大地GhostXP_SP3_2013极速装机5月版
  19. LRU算法,走迷宫,数根,星际战争
  20. 如何将代码插入到Word文档

热门文章

  1. 线性运放HCNR201-500E构成的模拟信号隔离放大电路
  2. Thinkphp 自动生成页码 分页显示
  3. unraid虚拟linux系统,UNRAID教程:3分钟用unraid自带的虚拟机安装黑群晖NAS DSM系统很强大!...
  4. 洛谷 - P1008 [NOIP1998 普及组] 三连击 [Java版]
  5. NDK学习笔记:FFmpeg解压MP34提取音频PCM(swrContext、swr_alloc_set_opts)
  6. WSL2 Ubuntu18.04 apt-get update失败
  7. 内外网同时使用之添加路由
  8. win7计算机内存占用高,win7系统内存占用高的解决方法
  9. 「机器学习」天池比赛:金融风控贷款违约预测
  10. mac与mac传输文件_Mac上传输的最佳选择