Студентам, яких я керував, було проведено наступну вправу:
Давши точок у площині, розробіть алгоритм, який знаходить пару точок, відстань яких мінімальна серед усіх пар точок. Алгоритм повинен працювати в часі .
Існує (відносно) простий алгоритм поділу і підкорення, який вирішує задачу в часі .
Запитання 1 : Чи існує алгоритм, який точно вирішує задану проблему в гіршому випадку ?
Що змусило мене підозрювати, що це може бути можливим - це результат, який я пам’ятаю, що бачив у деяких розмовах (посилання оцінене). Він визначав щось по лініях, що не більше постійного числа точок можна розташувати в площині навколо деякої точки всередині кола радіусом , з мінімальна відстань між будь-якими двома залученими точками . Я думаю, що , точки, що утворюють рівносторонній шестикутник з в центрі (в крайньому випадку).
У такому випадку наступний алгоритм повинен вирішити їх задачу за ять кроків.
fun mindist [] | p::[] = INFINITY
| mindist p1::p1::[] = dist(P[0], P[1])
| mindist p::r = let m = mindist(r) in
min(m, nextNeighbour(p, r, m))
end
Зауважте, що це (стверджується, що) у лінійному часі, оскільки лише постійна кількість точок у не r
може бути далекішою m
від p
(припускаючи вищевикладене твердження); лише ці пункти повинні бути досліджені для пошуку нового мінімуму. Звісно, є улов; як ви реалізуєте nextNeighbour
(можливо, з попередньою обробкою в лінійний час)?
Питання 2 : Нехай безліч точок і точка р ∉ R . Нехай m ∈ R з
і
.
Припустимо, що є кінцевим. Чи можна знайти з мінімальною відстані від за (амортизованим) часом ? (Ви можете припустити, що побудований, додаючи досліджувані точки одна за одною.) p ′ ∈ R p , m p O ( 1 ) R p