Коли ви маєте справу з проблемами просторової індексації, я фактично рекомендую починати з просторового хешу чи мого особистого фаворита: звичайної старої сітки.
... і зрозуміти його слабкі місця спочатку, перш ніж перейти до деревних структур, які дозволяють розріджувати уявлення.
Однією з очевидних недоліків є те, що ви можете витрачати пам’ять на багато порожніх комірок (хоча пристойно реалізована сітка не повинна вимагати більше 32 біт на клітинку, якщо ви фактично не маєте мільярдів вузлів для вставки). Інше полягає в тому, що якщо у вас елементи середнього розміру, що більше розміру комірки, і часто налічують десятки комірок, ви можете витратити багато пам'яті, вставляючи ці елементи середнього розміру в набагато більше комірок, ніж ідеальних. Так само, коли ви робите просторові запити, вам, можливо, доведеться перевірити більше комірок, іноді набагато більше, ніж ідеальних.
Але єдине, що потрібно впорядкувати за допомогою сітки, щоб зробити її максимально оптимальною, оскільки це може бути проти певного вводу cell size
, це не дає вам занадто багато думати і поспілкуватися, і тому це моя структура даних про перехід до даних для проблем просторової індексації, поки я не знайду причин не використовувати його. Це бруд простий у виконанні і не вимагає, щоб ви поспілкувалися з чим-небудь більш ніж одним вкладеним в експлуатацію.
Ви можете отримати багато з звичайної старої сітки, і я фактично переміг багато реалізацій квадратичного дерева та kd-дерева, що використовуються в комерційному програмному забезпеченні, замінивши їх на звичайну стару сітку (хоча вони не завжди були найкращими реалізованими , але автори витратили набагато більше часу, ніж 20 хвилин, які я витратив на збивання сітки). Ось швидка дрібничка, яку я пробув, щоб відповісти на запитання в іншому місці, використовуючи сітку для виявлення зіткнень (навіть не дуже оптимізовану, лише кілька годин роботи, і мені довелося витратити більшу частину часу, вивчаючи, як працює трафік, щоб відповісти на питання і вперше я здійснив виявлення зіткнень подібного роду):
Ще одна слабкість сіток (але вони є загальною слабкістю для багатьох структур просторової індексації) полягає в тому, що якщо ви вставите безліч збігаються або перекриваються елементів, як і багато точок з однаковою позицією, вони будуть вставлені в точно ту саму клітинку ) та погіршують ефективність при проходженні цієї комірки. Аналогічно, якщо ви вставляєте багато масивних елементів, які набагато перевищують розмір комірок, вони захочуть вставити в човновий набір комірок і використовувати багато і багато пам’яті та погіршити час, необхідний для просторових запитів у всій дошці .
Однак ці дві негайні вище проблеми з збігом та масовими елементами насправді є проблематичними для всіх структур просторової індексації. Проста стара сітка насправді обробляє ці патологічні випадки трохи краще, ніж багато інших, оскільки вона, принаймні, не хоче рекурсивно підрозділяти клітини знову і знову.
Коли ви починаєте з сітки і рухаєтесь до чогось подібного до квадратичного дерева або KD-дерева, то головна проблема, яку ви хочете вирішити, - це проблема з тим, що елементи вставляються в занадто багато комірок, мають занадто багато комірок, і / або потрібно перевірити занадто багато комірок із таким типом щільного подання.
Але якщо ви думаєте про квадратичне дерево як оптимізацію через сіткудля конкретних випадків використання, то це допомагає все-таки думати про ідею "мінімального розміру комірок", щоб обмежити глибину рекурсивного підрозділу вузлів чотирьох дерев. Коли ви це зробите, найгірший сценарій квадратичного дерева все одно погіршиться в щільну сітку на листках, лише менш ефективну, ніж сітка, оскільки їй буде потрібно логарифмічний час, щоб пройти шлях від кореня до комірки сітки замість постійний час. І все ж думка про цей мінімальний розмір комірок дозволить уникнути нескінченного сценарію циклу / рекурсії. Для масивних елементів також є кілька альтернативних варіантів, таких як пухкі квадрати, які не обов'язково розбиваються рівномірно і можуть мати AABB для дочірніх вузлів, які перекриваються. BVH також цікаві як структури просторової індексації, які не розподіляють рівномірно свої вузли. Для збігу елементів проти деревних структур, головне - просто накласти обмеження на підрозділ (або, як запропонували інші, просто відхилити їх або знайти спосіб поводження з ними так, ніби вони не вносять до унікальної кількості елементів у листі, коли визначають, коли лист слід підрозділити). Дерево Kd також може бути корисним, якщо ви передбачаєте, що вводиться багато елементів, що збігаються, оскільки вам потрібно врахувати лише один вимір, визначаючи, чи повинен середній вузол розбиватися.