在python中有效地合并两个对象

时间:2016-04-17 03:57:59

标签: python pointers object merge

我想要合并两个对象,这样两个合并对象的所有引用现在都指向一个合并对象。

#What I want
listOfObjects=[obj1, obj1, obj2, obj2, obj3]
mergeObjects(obj1, obj2)
#now
listofObjects==[merged, merged, merged, merged, obj3]

实现目标的一种方法是:

def mergeObjects(obj1, obj2):
    obj1.property1+=obj2.property1
    obj1.property2+=obj2.property2
    obj2=obj1

然而,这有一个缺点,即没有一个合并对象,我有一个合并对象和它的相同副本。我的程序会将几十个对象相互合并,所以这会占用太多的内存。

另一种方式是:

listOfObjects=[obj1, obj1, obj2, obj2, obj3]
mergeObjects(obj1, obj2)
for i in range(len(listOfObjects)):
    if (listOfObjects[i]==obj2):
        listOfObjects[i]==obj1
#now
listofObjects==[merged, merged, merged, merged, obj3]
#and obj2 is now free to be garbage collected

但是,对这些对象有多个引用,并且每次合并对象时迭代它们中的每一个也不是最佳的。

我想到的一件事是我是否可以使用指针。我可以改为存储一个指向对象的指针列表,然后写:

def mergeObjects(obj1_pointer, obj2_pointer):
    obj1=&obj1_pointer
    obj2=&obj2_pointer
    obj1.property1+=obj2.property1
    obj1.property2+=obj2.property2
    obj2_pointer=obj1_pointer
    #let's say the pointers are themselves objects so now we have:

    listOfPointers==[obj1_pointer, obj1_pointer, obj1_pointer, obj1_pointer, obj3_pointer]
    #obj1_pointer is now pointing to the merged object
    #obj2 now has no references so is free to be deleted

我在哪里使用&作为解引用算子。

那么使用dereference方法编写我自己的pseudopointer对象,返回一个对象是一个有效的解决方案吗?

如果没有更简洁的方法(将对象1更改为合并对象,那么对对象2的所有引用都是对对象1的引用)?

1 个答案:

答案 0 :(得分:0)

union-find data structure是做这样事情的好方法。它将对象分组,并挑选每组的元素作为代表。它支持两种操作:

  • 找到,它接受一个对象并返回该对象集的代表,
  • union ,它接受两个对象并将它们的集合连接成一个集合。其中一套'代表成为合并集的代表。

您可以使用代表跟踪合并的属性。通过排名和路径压缩实现了通常作为disjoint-set forest联合的方式,操作有效地分摊了常量时间,并且合并集合取消没有问题。 (如果您尝试使用内置的setset.union执行此操作,则会导致合并设置取消合并且操作速度非常慢。)

至于实际合并所有两个对象'引用指向一个对象,没有办法做到这一点。你的指针想法有其自身的问题;即使Python支持指针,当你尝试将第一个指针与第三个指针合并时,你最终会得到以前合并的指针。