Хороша ли какая-нибудь из этих библиотек quad-tree?

Похоже, что для одного моего проекта потребуется использование деревьев квадрантов, с которыми я никогда раньше не работал. Из того, что я читал, они должны обеспечивать существенное повышение производительности, чем грубая попытка решить проблему. Какие-нибудь из этих модулей Python хороши?

  • Quadtree 0.1.2 ‹= Нет: невозможно выполнить в Python 3.1
  • QuadTree ‹= Да: просто при работе с прямоугольниками
  • quadtree.py ‹= Нет: необходимые операции не поддерживаются

EDIT 1: Кто-нибудь знает о лучшей реализации, чем та, что представлена ​​в вики pygame?

РЕДАКТИРОВАТЬ 2: Вот несколько ресурсов, которые другие могут найти полезными для методов поиска пути в Python.


person Noctis Skytower    schedule 19.02.2010    source источник
comment
Я думаю, вы пропустили здесь один шаг: если у вас нет предыдущего опыта работы с деревьями квадрантов и вы не знаете, как их использовать, то как вы узнаете, что библиотека quadtree вам нужна? Даже если предположить, что вы нашли идеальное решение для своих нужд, не возникнет ли у вас проблем с его правильным использованием? ИМО, вам нужно немного больше изучить проблему, прежде чем приступать к реализации.   -  person John Feminella    schedule 19.02.2010


Ответы (4)


В этот комментарий, joferkington относится к текущему вопросу и говорит:

Как бы то ни было, scipy.spatial.KDTree (и/или scipy.spatial.cKDTree, написанный на C из соображений производительности) — гораздо более надежный выбор, чем перечисленные варианты.

person Robert Pollak    schedule 13.11.2012
comment
Честно говоря, scipy.spatial.KDTree — лучшее решение, только если возможна установка scipy. Это может быть не так (у scipy есть несколько интересных зависимостей). - person alastair; 07.03.2013
comment
Обратите внимание, что KDTree от scipy ориентирован на кластеризацию вариантов использования, а также имеет некоторую неочевидную терминологию для неученых. Например, хотите запросить у дерева все точки в AABB? Ну, тогда вам нужно использовать query_ball_point с p=1, конечно (: Но вы все еще не можете ввести свою собственную форму коробки (это всегда сфера). Также не поддерживает динамические обновления. Это хороший код, но может потребоваться дополнительная работа для понять и получить то, что вы хотите от него, чем некоторые другие решения. - person jwd; 03.11.2019

Еще одна библиотека, которую стоит проверить, это PyQuadTree, чистый индекс дерева квадрантов Python, который также работает на Python 3x. Все, что вам нужно, чтобы добавить элемент, — это его ограничивающая рамка в виде последовательности из 4 длин, поэтому ее можно использовать для различных целей и даже в отрицательных системах координат.

Хотя я и являюсь автором, я просто взял чужую структуру/код дерева квадрантов и сделал его более удобным для пользователя, добавил поддержку прямоугольных квадроциклов и добавил документацию. Простой пример того, как его использовать:

#SETUP
import pyqtree
spindex = pyqtree.Index(bbox=[0,0,1000,500])

#ADD SOME ITEMS
for item in items:
    spindex.insert(item=item, bbox=item.bbox)

#RETRIEVE ITEMS FROM A REGION
result = spindex.intersect(bbox=[233,121,356,242])
person Karim Bahgat    schedule 25.05.2014

Индекс пакета python создает 2 другие библиотеки при поиске quadtree: http://pypi.python.org/pypi?%3Aaction=search&term=quadtree&submit=search

отказ от ответственности: никогда не использовал quadtrees или любую из этих библиотек.

person gurney alex    schedule 19.03.2010
comment
Кажется, это лучший ответ. Это не помогает, но это лучше всего. - person Noctis Skytower; 24.05.2010

Иногда не очевидно, как реализовать такие структуры данных, как деревья, в Python.

Например,

      D 
    /   \
   B     F
  / \   / \
 A   C E   G

представляет собой простую структуру бинарного дерева. В Python вы бы представили это так:

[D,B,F] — это узел с левым и правым поддеревьями. Чтобы представить полное дерево, у вас будет:

[D,[[B,A,C],[F,E,G]]] 

Это простой список вложенных списков, где любой узел может быть значением, например D или C, и любой узел может быть поддеревом, которое рекурсивно представляет собой список вложенных списков. Вы можете сделать что-то подобное со словарем словарей. Эти типы реализации немного быстрые и грязные и могут быть неприемлемы в задании, где инструктор ожидает класс Node с указателями на другие узлы, но в реальном мире, как правило, лучше использовать оптимизированные реализации списков/словарей Python. первый. Только если результат каким-то образом неадекватен, перепишите его так, чтобы он был больше похож на то, что вы написали бы на C или Java.

Помимо этого, конечно, вам нужно реализовать различные алгоритмы для управления вашими деревьями, потому что дерево квадрантов — это больше, чем просто некоторые данные; это набор правил о том, как вставлять и удалять узлы. Если это не вопрос курсовой работы, то Quadtree 0.1.2, вероятно, будет хорошая идея.

person Michael Dillon    schedule 19.02.2010
comment
Quadtree 0.1.2 не будет работать в Python 3.1, так как нет инструментов настройки. Исходный код должен быть скомпилирован для работы в Windows. - person Noctis Skytower; 20.02.2010
comment
Если вам действительно нужна производительность, вы можете скомпилировать модуль для Python 3.1. Если вы не можете сделать это самостоятельно, зайдите на comp.lang.python и спросите, может ли кто-нибудь сделать это за вас. - person Michael Dillon; 23.02.2010