最近点对

二维最近点对

看了https://blog.csdn.net/lishuhuakai/article/details/9133961的博客 受益匪浅

用python实现了算法

import math
import cv2
import numpy as np
import random
import os

md = float('inf')
pts = []

def take_first( elem):
    return elem[0]

def get_d(a,b):
    global md,pts
    d = math.sqrt((a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]))
    if d<md:
        pts = [[a,b]]
        md = d
    if d==md:
        pts.append([a,b])
        md = d
    return d

def min_between(point, left, mid, right, d):
    temp = float('inf')
    for i in range(left, mid):
        if abs(point[i][0] - point[mid][0]) <= d:
            for j in range(mid, right):
                if abs(point[i][0] - point[j][0]) <= d and abs(point[i][1] - point[j][1]) <= d : 
                    if get_d(point[i], point[j]) < temp:
                        temp = get_d(point[i], point[j])
    return temp

def divide(point, left, right):
    # right不包括
    if right - left < 2 :
        return float('inf')
    elif right - left == 2:
        return get_d(point[left], point[left + 1])
    else:
        mid = int((left + right) / 2)
        min_left = divide(point, left, mid)
        min_right = divide(point, mid, right)
        d = min(min_left,min_right)
        min_mid = min_between(point,left,mid,right,d)

        return min(min_left, min_right,min_mid)

def init(num=20):
    seed = []
    for i in range(0, num):
        x = random.randint(0, 640)
        y = random.randint(0, 640)
        seed.append([x, y])
    return seed

pos =  init(50)
print(divide(pos,0,len(pos)))
print(pts)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值