Python 四叉树遍历的不同输出

Python 四叉树遍历的不同输出,python,anaconda,quadtree,Python,Anaconda,Quadtree,在不同的环境(anaconda、python、2.7、3.5)中,一次又一次地运行同一个程序时,我有不同的输出 有人能解释一下四叉树中的遍历行为吗 我用过图书馆 看看代码和输出 from pyqtree import Index class Dataset: def __init__(self,id,x,y): self.id = id self.bbox = (x,y,x,y) spidex = Index(bbox=(0,0,80,80)) p

在不同的环境(anaconda、python、2.7、3.5)中,一次又一次地运行同一个程序时,我有不同的输出

有人能解释一下四叉树中的遍历行为吗

我用过图书馆

看看代码和输出

from pyqtree import Index

class Dataset:
    def __init__(self,id,x,y):
        self.id = id
        self.bbox = (x,y,x,y)

spidex = Index(bbox=(0,0,80,80))

p = [[0]*4]*4
k = 0

i1 = i2 = 0
for i in range(10,81,20):
    for j in range(10,81,20):
        p[i1][i2] = Dataset(k,i,j)
        k += 1
        spidex.insert(p[i1][i2],(p[i1][i2]).bbox)
        i2 +=1
    i1+=1
    i2 = 0

o9 = (0,0,80,80)

matches = spidex.intersect(o9)

for i in matches:
    # print(str(i.id))
    print('p'+str(i.id)+' --> ('+str(i.bbox[0])+','+str(i.bbox[1])+')')
当我使用第一条注释语句和第二条注释语句时,输出是不同的

不同的产出:

/usr/bin/python qt3.py
p6--> (30,50)
p10--> (50,50)
p3--> (10,70)
p11--> (50,70)
p14--> (70,50)
p7--> (30,70)
p0--> (10,10)
p13--> (70,30)
p4--> (30,10)
p8--> (50,10)
p1--> (10,30)
p5--> (30,30)
p12--> (70,10)
p15--> (70,70)
p9--> (50,30)
p2--> (10,50)

python2 qt3.py
p14 --> (70,50)
p6 --> (30,50)
p10 --> (50,50)
p3 --> (10,70)
p11 --> (50,70)
p7 --> (30,70)
p0 --> (10,10)
p13 --> (70,30)
p4 --> (30,10)
p15 --> (70,70)
p8 --> (50,10)
p1 --> (10,30)
p5 --> (30,30)
p12 --> (70,10)
p9 --> (50,30)
p2 --> (10,50)

有两种以上不同的输出。如果您有确定性行为,请告诉我。请另作解释。

两种输出都是相同的:只是匹配的显示顺序不同

这是由于Pyqtree计算交集的方式:它将结果放在一个数组中,而集合是无序的

(intersect的文档字符串表示:

返回: -其边界框与输入框相交的插入项列表

但是它实际上是一个集合,而不是一个列表,被使用)

因此,随着Python版本的变化,顺序也会发生变化,这并不奇怪。

如果您想要一个恒定的顺序,您应该对匹配项进行排序。

但是我使用pyqtree交集仅仅是为了以某种逻辑方式构建索引。如果我对它进行排序,那么它将基于id,这不是我想要的。我读到四叉树用于空间索引,不是这样做的吗?如果不是在id上,那么你必须在其他东西上对它们进行排序。因此,您应该定义“逻辑方式”对您意味着什么,并进行相应的排序,因为没有“自然”排序顺序。