Closest Pair Implemetation Python

前端 未结 4 1986
时光说笑
时光说笑 2021-02-04 17:32

I am trying to implement the closest pair problem in Python using divide and conquer, everything seems to work fine except that in some input cases, there is a wrong answer. My

4条回答
  •  名媛妹妹
    2021-02-04 18:29

    Here is a recursive divide-and-conquer python implementation of the closest point problem based on the heap data structure. It also accounts for the negative integers. It can return the k-closest point by popping k nodes in the heap using heappop().

    from __future__ import division
    from collections import namedtuple
    from random import randint
    import math as m
    import heapq as hq
    
    def get_key(item):
        return(item[0])
    
    
    def closest_point_problem(points):
        point = []
        heap = []
        pt = namedtuple('pt', 'x y')
        for i in range(len(points)):
            point.append(pt(points[i][0], points[i][1]))
        point = sorted(point, key=get_key)
        visited_index = []
        find_min(0, len(point) - 1, point, heap, visited_index)
        print(hq.heappop(heap))
    
    def find_min(start, end, point, heap, visited_index):
        if len(point[start:end + 1]) & 1:
            mid = start + ((len(point[start:end + 1]) + 1) >> 1)
        else:
            mid = start + (len(point[start:end + 1]) >> 1)
            if start in visited_index:
                start = start + 1
            if end in visited_index:
                end = end - 1
        if len(point[start:end + 1]) > 3:
            if start < mid - 1:
                distance1 = m.sqrt((point[start].x - point[start + 1].x) ** 2 + (point[start].y - point[start + 1].y) ** 2)
                distance2 = m.sqrt((point[mid].x - point[mid - 1].x) ** 2 + (point[mid].y - point[mid - 1].y) ** 2)
                if distance1 < distance2:
                    hq.heappush(heap, (distance1, ((point[start].x, point[start].y), (point[start + 1].x, point[start + 1].y))))
                else:
                    hq.heappush(heap, (distance2, ((point[mid].x, point[mid].y), (point[mid - 1].x, point[mid - 1].y))))
                visited_index.append(start)
                visited_index.append(start + 1)
                visited_index.append(mid)
                visited_index.append(mid - 1)
                find_min(start, mid, point, heap, visited_index)
            if mid + 1 < end:
                distance1 = m.sqrt((point[mid].x - point[mid + 1].x) ** 2 + (point[mid].y - point[mid + 1].y) ** 2)
                distance2 = m.sqrt((point[end].x - point[end - 1].x) ** 2 + (point[end].y - point[end - 1].y) ** 2)
                if distance1 < distance2:
                    hq.heappush(heap, (distance1, ((point[mid].x, point[mid].y), (point[mid + 1].x, point[mid + 1].y))))
                else:
                    hq.heappush(heap, (distance2, ((point[end].x, point[end].y), (point[end - 1].x, point[end - 1].y))))
                visited_index.append(end)
                visited_index.append(end - 1)
                visited_index.append(mid)
                visited_index.append(mid + 1)
                find_min(mid, end, point, heap, visited_index)
    
    x = []
    num_points = 10
    for i in range(num_points):
        x.append((randint(- num_points << 2, num_points << 2), randint(- num_points << 2, num_points << 2)))
    closest_point_problem(x)
    

    :)

提交回复
热议问题