Проблема з квадратом / октрі в пошуках найближчого сусіда полягає в тому, що найближчий об'єкт може сидіти прямо навпроти поділу між вузлами. Для зіткнень це нормально, тому що якщо він не знаходиться у вузлі, нас це не хвилює. Але розглянемо цей двовимірний приклад з квадратом:
Тут, незважаючи на те, що чорний і зелений елемент знаходяться в одному вузлі, чорний елемент найближчий до синього. Відповідь ultifinitus може гарантувати лише найближчому сусідові, тільки кожен предмет на вашому дереві розміщується в найменшому можливому вузлі, який міг би його містити, або в унікальний вузол - це призводить до більш неефективних четвертин. (Зауважте, що існує багато різних способів реалізації структури, яку можна назвати квадрокод / октре - більш суворі реалізації можуть працювати краще в цій програмі.)
Кращим варіантом буде kd-дерево . Kd-дерева мають дуже ефективний алгоритм пошуку найближчого сусіда , який ви можете реалізувати, і він може містити будь-яку кількість вимірів (отже, "k" розміри.)
Чудова та інформативна анімація з Вікіпедії:
Найбільша проблема використання kd-дерев, якщо я правильно пам'ятаю, полягає в тому, що їм складніше вставляти / вилучати елементи із збереження балансу. Тому я б рекомендував використовувати одне kd-дерево для статичних об'єктів, таких як будинки та дерева, яке є високо збалансованим, а інше, яке містить плеєри та транспортні засоби, що потребує регулярного балансування. Знайдіть найближчий статичний об’єкт та найближчий мобільний об’єкт та порівняйте ці два.
Нарешті, kd-дерева досить просто здійснити, і я впевнений, що ви можете знайти безліч бібліотек C ++ з ними. Як я пам’ятаю, R-дерева набагато складніші, і, ймовірно, надмірні, якщо все, що вам потрібно, - це простий пошук найближчого сусіда.