四叉树遍历的不同输出

Different output on quadtree traversal

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

谁能解释四叉树中遍历的行为。

我用过this库。

看一下代码和输出。

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)

有两个以上的不同输出。如果您有确定性行为,请告诉我。否则请解释该行为。

两个输出相同:只有 order 显示的匹配不同。

这是由于 Pyqtree 计算交集的方式:它将结果放在 set 中,并且集是无序的。

intersect 的文档字符串说:

Returns: - A list of inserted items whose bounding boxes intersect with the input bbox.

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

因此,顺序随您的 Python 版本而变化也就不足为奇了。
如果你想要一个不变的顺序,你应该对你的比赛进行排序。