تعیین نزدیکترین زوج نقاط در فضای دو بعدی

راست|بندانگشتی|نزدیک‌ترین زوج نقطه با رنگ قرمز نشان داده شده است.

**مسئله نزدیکترین زوج نقاط** یا **نزدیکترین زوج** یک مسئله از هندسه محاسباتی است که در آن در فضای متری n نقطه به عنوان ورودی گرفته می‌شود و زوج نقطه‌ای که کوتاه‌ترین فاصله بین آن‌دو وجود دارد، پیدا می‌شود. مسئله نزدیکترین زوج برای نقاط در صفحهٔ اقلیدسی از اولین مسائل هندسه بود که مطالعات سیستماتیک در نظریه پیچیدگی محاسباتی، الگوریتم‌های هندسه شد.

الگوریتم ساده، پیدا کردن فاصلهٔ همهٔ زوج نقاط و انتخاب کمینهٔ آن‌هاست که نیازمند زمانی از مرتبهٔ  O(n^2)است. به نظر می‌رسد مسئله در زمان O(nlgn)در فضای اقلیدسی با بعد ثابت d قابل حل باشد. در درخت تصمیم جبری مدل محاسبه الگوریتم با زمان O(nlgn
)با توجه به کاهشی از مساله یکتایی عنصر بهینه است. در مدل محاسباتی چنین فرض می‌شود که تابع کف در زمان ثابت قابل محاسبه است و مساله می‌تواند در O(nlglgn)حل شود. اگر در تابع کف از حالت تصادفی استفاده کنیم مسئله در O(n)نیز قابل حل است.

## جستجوی جامع
نزدیکترین زوج از نقاط با استتفاده از جستجوی جامع در نظریه پیچیدگی محاسباتی O(n^2)قابل محاسبه است. برای این کار باید فاصلهٔ میان تمام\frac{n(n-1)}{2} زوج نقطه را محاسبه کرده و زوجی را که کم‌ترین فاصله را دارند، انتحاب کنیم. شبه کد این الگوریتم در زیرمشاهده می‌شود.
```
minDist = infinity
for i = 1 to length(P) - 1
 for j = i + 1 to length(P)
  let p = P[i], q = P[j]
  if dist(p, q) < minDist:
   minDist = dist(p, q)
   closestPair = (p, q)
return closestPair
```


## حالت صفحه
مسئله با استفاده از الگوریتم تقسیم و حل در زمان O(nlogn
)قابل حل است. رویه در زیر قابل مشاهده است.
# نقاط را براساس مولفهٔ xآن‌ها مرتب می‌کنیم.
# مجموعهٔ نقاط را با استفاده از یک خط عمودی به صورت x = x_{mid}به دو زیرمجموعهٔ با اندازهٔ مساوی تقسیم می‌کنیم.
# مسئله را به صورت بازگشتی برای زیرمجموعه‌های راست و چپ حل می‌کنیم که کمینهٔ فاصله برای سمت راست و چپ به ترتیب به صورت d_{Rmin}و d_{Lmin}به دست می‌آید.
# کمینه فاصله بین نقاطی را که یکی‌شان در زیرمجموعهٔ سمت چپ قرار دارد و دیگری در زیرمجموعهٔ سمت راست انتخاب می‌کنیم و آن را d_{LRmin} می‌نامیم.
# جواب نهایی کمینه فاصله میان d_{LRmin} d_{Lmin} d_{Rmin} است.

به نظر می‌رسد مرحلهٔ ۴ در زمان خطی انجام پذیرد. بار دیگر روش ساده برای این کار نیاز به محاسبهٔ فاصلهٔ همهٔ زوج نقاط در چپ و راست است که نیازمند زمان از مرتبهٔ O(n^2) است. نکتهٔ اصلی در خاصیت پراکندگی مجموعهٔ نقاط است. می‌دانیم که نزدیک‌ترین زوج نقاط قطعاً فاصله‌ای بیش‌تر از dist = \min(d_{Lmin}, d_{Rmin}) ندارد. پس کافی‌ست برای هر نقطه در سمت چپ خط جدا کننده، کافی است نقاطی را که در مستطیلی به ابعاد(dist, 2*dist) در سمت راست خط جدا کننده قرار دارند را بررسی کنیم که در شکل نیز نمایش داده‌شده است. به علاوه این مستطیل حداکثر ۶ نقطه می‌تواند در خود جای دهد که حداکثر فاصله‌شان d_{Rmin} است؛ بنابراین تعداد بهینهٔ محاسبات در مرحلهٔ ۴، حداکثر محاسبه‌ی 6nبین زوج نقاطی که یکی‌شان در سمت چپ و دیگری در سمت راست خط جدا کننده است. رابطهٔ بازگشتی برقرار بین مراحل بالا T(n) = 2T(\frac{n}{2}) + O(n) است که با استفاده از قضیه اصلی واکاوی الگوریتم‌ها داریم:O(nlgn).

راست|بندانگشتی|تقسیم وحل: مستطیل جدا کننده

همانند مسئله نزدیکترین زوج نقاط، یالی را در مثلث‌بندی دیلانی تعریف می‌کنیم که برابر دو خانهٔ مجاور در دیاگرام ورونوی است. نزدیک‌ترین زوج نقاط را با استفاده از دوساختار بالا می‌توان در زمان خطی محاسبه کرد. هزینه ایجاد دو ساختارمثلث‌بندی دیلانی یا دیاگرام ورونوی از لحاظ محاسباتیO(nlgn) است. در حالی که ره‌یافت تقسیم و حل برای تمام ابعاد هزینهٔ محاسباتی ثابتی برابر O(nlgn) دارد، این روش‌ها برای بعدهای بیش از ۲ این روش‌ها مناسب نیستند.


```text
Algorithm Closest_Pair(p1, p2, ..., pn);
Input: p1, p2, ..., pn (a set of n points in the plane)
Output: d (the distance between the two closest points in the set)

begin
    sort the points according to their x coordinates;
    {''this sorting is done only once at the beginning''}
    Didive the set into two equal-sized parts;
    Recursively do the following:
        compute the minimal distance in each part;
        sort the points in each part according to their y coordinates;
    Merge the two sorted lists into one sorted list;
    {''Notice that we must merge before we eliminate; 
        we need to supply the whole set sorted to the next level of the recursion''}
    Let d be the minimal of the minimal distances;
    Eliminate points that lie further than d apart from the seperation line;
    Scan the points in the y order and compute the distances of each point to its five neighbors;
    if any of these distances is less than d the update d;
end
```


## یادداشت‌ها

## جستارهای وابسته
* جستجوی نزدیکترین همسایه
* پوشش مجموعه

## منابع

* Thomas H. Cormen, Charles E. Leiserson, رونالد ریوست، and کلیفورد استین. *[[مقدمه‌ای بر الگوریتم‌ها]]*, Second Edition. MIT Press and McGraw-Hill, 2001. . Pages 957–961 of section 33.4: Finding the closest pair of points.
* 
*UCSB Lecture Notes
*rosettacode.org - Closest pair of points implemented in multiple programming languages
*Line sweep algorithm for the closest pair problem

رده:الگوریتم‌های هندسی