给定n个二维空间中的点(x1,y1)(x2,y2)...(xn,yn),设计一个寻找两点之间距离最近的点对的算法,并分析算法时间复杂度

暴力求解:

import random
import numpy
import math
import time
import matplotlib.pyplot as plt
import image# 暴力求解最近点对问题
n = 500
closest_pair = {}
# 存最后结果
buff = {}
minimum = float("inf")point = [(random.randint(0, 3*n), random.randint(0, 3*n)) for i in range(0, n)]
# 随机生成n个坐标print(point)
print("\n\n\n")point.sort()
print(point)plt.xlim(0, 3*n)
plt.ylim(0, 3*n)
plt.title("Point Pair")
for i in range(len(point)):plt.plot(point[i][0], point[i][1], 'ro-')def get_distance(a, b):global buffdistance = math.sqrt((a[0]-b[0])**2+(a[1]-b[1])**2)if distance in buff:buff[distance].append((a, b))else:buff[distance] = [(a, b)]return distancedef judge_minimum(temp):global minimumminimum = temp if temp <= minimum else minimum# 暴力找最小
time_start = time.time()
for i in range(0, n-1):for j in range(i+1, n):judge_minimum(get_distance(point[i], point[j]))closest_pair[minimum] = buff[minimum][:]
# 最后结果存入closest_pair中
time_end = time.time()print("\n\n\n\nrun_time is :", time_end-time_start)print("\n\n\n"+"The Closest Pair is:",closest_pair[minimum], "    Distance:", minimum)for i in range(0, len(closest_pair[minimum])):plt.plot(closest_pair[minimum][i][0][0],closest_pair[minimum][i][0][1], "bo-")plt.plot(closest_pair[minimum][i][1][0],closest_pair[minimum][i][1][1], "bo-")
plt.show()

分治法求解(较简陋):

import random
import numpy
import math
import time
import matplotlib.pyplot as plt# 分治法求解最近点对问题
n = 500
minimum = float("inf")
point = [(random.randint(0, 3*n), random.randint(0, 3*n)) for i in range(0, n)]
# 随机生成n个坐标print(point)
print("\n\n\n")
closest_pair = {}
buff = {}point.sort()
print(point)plt.xlim(0, 3*n)
plt.ylim(0, 3*n)
plt.title("Point Pair")
for i in range(len(point)):plt.plot(point[i][0], point[i][1], 'ro-')def get_distance(a, b):# print(a,b)distance = math.sqrt((a[0]-b[0])**2+(a[1]-b[1])**2)if distance in buff:buff[distance].append((a, b))else:buff[distance] = [(a, b)]return distancedef judge_minimum(temp):global minimumglobal buffif temp not in buff:return minimumif minimum < temp:passelif minimum == temp:for i in range(0, len(buff[temp])):closest_pair[minimum].append(buff[temp][i])else:minimum = tempclosest_pair.clear()closest_pair[temp] = buff[temp][:]return minimumdef min_between(point, left, mid, right, minimum):global buff, closest_pairfor i in range(left, mid):if abs(point[i][0]-point[mid][0]) <= minimum:for j in range(mid, right):if abs(point[i][0]-point[j][0]) <= minimum and abs(point[i][1]-point[j][1]) <= minimum:get_distance(point[i], point[j])if len(buff) > 0:buff = sorted(buff.items(), key=lambda buff: buff[0])temp = buff[0][0]buff = dict(buff)else:temp = float("inf")return tempdef divide(point, left, right):global minimum, buff# right不包括if right-left < 2:return float('inf')elif right-left == 2:return get_distance(point[left], point[left+1])else:mid = int((left+right)/2)min_left = divide(point, left, mid)# print("min_left:",min_left)minimum = judge_minimum(min_left)buff.clear()min_right = divide(point, mid, right)# print("min_right",min_right)minimum = judge_minimum(min_right)buff.clear()temp = min_between(point, left, mid, right, minimum)# print("temp",temp)minimum = judge_minimum(temp)buff.clear()return min(min_left, min_right, temp)time_start = time.time()
divide(point, 0, len(point))
time_end = time.time()
print("\n\n\n\nrun_time is :", time_end-time_start)print("\n\n\n"+"The Closest Pair is:",closest_pair[minimum], "   Distance:", minimum)
for i in range(0, len(closest_pair[minimum])):plt.plot(closest_pair[minimum][i][0][0],closest_pair[minimum][i][0][1], "bo-")plt.plot(closest_pair[minimum][i][1][0],closest_pair[minimum][i][1][1], "bo-")
plt.show()

二维空间最近点对问题 python相关推荐

  1. 最近点对问题python解法

    开始复习之前学过的内容,与大家分享下 目标: INPUT: 平面上的 n 个点 OUTPUT: 欧式距离最近的点对 最原始想法:遍历所有点的集合,具有o(n^2)的时间复杂度 可以使用分治思想进行算法 ...

  2. 【强化学习】Sarsa算法详解以及用于二维空间探索【Python实现】

    Sarsa算法 Sarsa算法,是基于Q-Learning算法.改动其实很小. 本文工作基于之前的Q-Learning的项目,如果有疑问可以看下面两个问题: [强化学习]Q-Learning算法详解以 ...

  3. 使用Python编写CFD程序-模拟二维空间气流气压+绘制风场气压场动画(详细教程)

    本文为博主原创文章,未经博主允许不得转载 1.模拟二维空间气流气压用到的方程式 计算2D空间气流气压要用到以下方程式: 其中第一个方程为xxx方向速度uuu的N-S方程式(Navier-Stokes ...

  4. python基础-模仿醉汉在二维空间上的随机漫步

    内容: 模仿醉汉在二维空间上的随机漫步:一个醉汉喝醉酒,每次只能走一步,每步分别沿着x,y轴走一个单位长度,试着画出醉汉的轨迹. 方法一:沿任意方向移动 思路:醉汉可以往任意方向走一步,则移动的角度可 ...

  5. 【强化学习】Q-Learning用于二维空间探索【Python实现】

    前言 这个基于之前的工作,如果有什么疑问也可以参照以前的文章. [强化学习]Q-Learning算法详解以及Python实现[80行代码] 本文主要做了两件事情 将上篇文章中得弱智般的treasure ...

  6. python计算四元素组合算法_python – 算法,列表元素之间的最近点

    这种方法是一种强力方法,但使用类似于Dijkstra算法的消除方法,这导致了更少的情况(使得算法最有可能快几个数量级,特别是对于大型列表或大量列表).告诉我你是否理解它,我可以澄清一下.可以在此处找到 ...

  7. KD-tree的原理以及构建与查询操作的python实现

    原文地址http://blog.csdn.net/u010551621/article/details/44813299#comments 前几天小组讨论会上展示了kd-tree(k-dimensio ...

  8. python高维数据_t-SNE高维数据可视化(python)

    t-SNE实践--sklearn教程 t-SNE是一种集降维与可视化于一体的技术,它是基于SNE可视化的改进,解决了SNE在可视化后样本分布拥挤.边界不明显的特点,是目前最好的降维可视化手段. 关于t ...

  9. python机器学习案例系列教程——K最近邻算法(KNN)、kd树

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 K最近邻简介 K最近邻属于一种估值或分类算法,他的解释很容易. 我们假设一个人的优秀成为设定为1.2.3.4.5.6.7.8.9.10 ...

最新文章

  1. vmware 12中安装 OpenWRT 及 网络配置
  2. Oracle 数据库-服务器端字符集查看方法
  3. 深入理解分布式技术 - 顺序消费如何才能保证时序性
  4. 浏览器渲染机制面试_面试官不讲码德,问我Chrome浏览器的渲染原理(6000字长文)...
  5. Mozilla官方:Firefox 3.5.1问题并非安全漏洞 仅是堆溢出Crash
  6. 使用DOM Breakpoints找到修改属性的Javascript代码
  7. 前端学习(808):复杂数据类型传参
  8. html5 graphics with svg css3,Using SVG with CSS3 and HTML5: Vector Graphics for Web Design
  9. win10配置python3虚拟环境_win10下搭建python3+scarpy虚拟环境
  10. 修复Cydia红字 flAbsPath on /var/lib/dpkg/status failed
  11. 2021年全新大数据学习路线图,(含入门到精通项目学习免费教程哦)
  12. .net 微信会员卡接口
  13. 电信业务经营许可年报流程图文指南,教你年报怎么填
  14. storm风暴英雄 tempo_风暴英雄玩好乔汉娜需要知道的7个技巧 TempoStorm
  15. Keras学习之:tensorboard 异常报错及处理方法
  16. 摩拜ofo补贴战熄火 月卡大涨价网店打折卖
  17. linux在午夜运行什么命令,在Linux中如何使用at命令安排任务
  18. 安卓基于Android健身室外跑步运动轨迹打卡计步器app
  19. 3.3 SQL---单表查询
  20. JZOJ5219. B

热门文章

  1. 币圈的8大女神都是谁?-千氪
  2. c语言实现url编码源码,URL encode 与 URL decode 的C语言实现
  3. 软件默认安装在C盘解决方案 eg:google浏览器、XMind脑图工具等
  4. xshell常用命令和快捷键----(备忘、随时更新)
  5. 陆奇谈世界新格局下的创业创新机会:惠人达己,守正出奇
  6. NO.12【婳骨】の张三-打工人之路
  7. linux 虚拟机连接外网配置,很简单
  8. 51单片机智能远程遥控温控PWM电风扇系统红外遥控温度速度定时关机
  9. Python爬取新浪微博评论数据,写入csv文件中
  10. mysql 截取括号内字符串_Mysql字符串截取_获取指定字符串中的数据