二维空间最近点对问题 python
给定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相关推荐
- 最近点对问题python解法
开始复习之前学过的内容,与大家分享下 目标: INPUT: 平面上的 n 个点 OUTPUT: 欧式距离最近的点对 最原始想法:遍历所有点的集合,具有o(n^2)的时间复杂度 可以使用分治思想进行算法 ...
- 【强化学习】Sarsa算法详解以及用于二维空间探索【Python实现】
Sarsa算法 Sarsa算法,是基于Q-Learning算法.改动其实很小. 本文工作基于之前的Q-Learning的项目,如果有疑问可以看下面两个问题: [强化学习]Q-Learning算法详解以 ...
- 使用Python编写CFD程序-模拟二维空间气流气压+绘制风场气压场动画(详细教程)
本文为博主原创文章,未经博主允许不得转载 1.模拟二维空间气流气压用到的方程式 计算2D空间气流气压要用到以下方程式: 其中第一个方程为xxx方向速度uuu的N-S方程式(Navier-Stokes ...
- python基础-模仿醉汉在二维空间上的随机漫步
内容: 模仿醉汉在二维空间上的随机漫步:一个醉汉喝醉酒,每次只能走一步,每步分别沿着x,y轴走一个单位长度,试着画出醉汉的轨迹. 方法一:沿任意方向移动 思路:醉汉可以往任意方向走一步,则移动的角度可 ...
- 【强化学习】Q-Learning用于二维空间探索【Python实现】
前言 这个基于之前的工作,如果有什么疑问也可以参照以前的文章. [强化学习]Q-Learning算法详解以及Python实现[80行代码] 本文主要做了两件事情 将上篇文章中得弱智般的treasure ...
- python计算四元素组合算法_python – 算法,列表元素之间的最近点
这种方法是一种强力方法,但使用类似于Dijkstra算法的消除方法,这导致了更少的情况(使得算法最有可能快几个数量级,特别是对于大型列表或大量列表).告诉我你是否理解它,我可以澄清一下.可以在此处找到 ...
- KD-tree的原理以及构建与查询操作的python实现
原文地址http://blog.csdn.net/u010551621/article/details/44813299#comments 前几天小组讨论会上展示了kd-tree(k-dimensio ...
- python高维数据_t-SNE高维数据可视化(python)
t-SNE实践--sklearn教程 t-SNE是一种集降维与可视化于一体的技术,它是基于SNE可视化的改进,解决了SNE在可视化后样本分布拥挤.边界不明显的特点,是目前最好的降维可视化手段. 关于t ...
- python机器学习案例系列教程——K最近邻算法(KNN)、kd树
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 K最近邻简介 K最近邻属于一种估值或分类算法,他的解释很容易. 我们假设一个人的优秀成为设定为1.2.3.4.5.6.7.8.9.10 ...
最新文章
- vmware 12中安装 OpenWRT 及 网络配置
- Oracle 数据库-服务器端字符集查看方法
- 深入理解分布式技术 - 顺序消费如何才能保证时序性
- 浏览器渲染机制面试_面试官不讲码德,问我Chrome浏览器的渲染原理(6000字长文)...
- Mozilla官方:Firefox 3.5.1问题并非安全漏洞 仅是堆溢出Crash
- 使用DOM Breakpoints找到修改属性的Javascript代码
- 前端学习(808):复杂数据类型传参
- html5 graphics with svg css3,Using SVG with CSS3 and HTML5: Vector Graphics for Web Design
- win10配置python3虚拟环境_win10下搭建python3+scarpy虚拟环境
- 修复Cydia红字 flAbsPath on /var/lib/dpkg/status failed
- 2021年全新大数据学习路线图,(含入门到精通项目学习免费教程哦)
- .net 微信会员卡接口
- 电信业务经营许可年报流程图文指南,教你年报怎么填
- storm风暴英雄 tempo_风暴英雄玩好乔汉娜需要知道的7个技巧 TempoStorm
- Keras学习之:tensorboard 异常报错及处理方法
- 摩拜ofo补贴战熄火 月卡大涨价网店打折卖
- linux在午夜运行什么命令,在Linux中如何使用at命令安排任务
- 安卓基于Android健身室外跑步运动轨迹打卡计步器app
- 3.3 SQL---单表查询
- JZOJ5219. B
热门文章
- 币圈的8大女神都是谁?-千氪
- c语言实现url编码源码,URL encode 与 URL decode 的C语言实现
- 软件默认安装在C盘解决方案 eg:google浏览器、XMind脑图工具等
- xshell常用命令和快捷键----(备忘、随时更新)
- 陆奇谈世界新格局下的创业创新机会:惠人达己,守正出奇
- NO.12【婳骨】の张三-打工人之路
- linux 虚拟机连接外网配置,很简单
- 51单片机智能远程遥控温控PWM电风扇系统红外遥控温度速度定时关机
- Python爬取新浪微博评论数据,写入csv文件中
- mysql 截取括号内字符串_Mysql字符串截取_获取指定字符串中的数据