我正在尝试使用python 3编写父搜索代码。
Parent是一个基于0的数组,包含该元素的父元素。 例如,parent = [0,0]表示
第一个元素的父亲本身就是。
第二个元素的父元素是第一个元素,因此是第二个元素 value等于第一个元素的值
首先,我尝试使用递归方法。
def getParent2(table):
# find parent and compress path
if table!=parent[table]:
parent[table]=getParent2(parent[table])
return parent[table]
尽管这种方法似乎表现出非常好的速度,但它在一个非常大的父数组中遇到了堆栈溢出问题。
(*设置recursionlimit也导致系统错误代码为7。)
我尝试将其修改为迭代方法
def getParent3(table):
while table!=parent[table]:
table=parent[table]
return table
不幸的是,它在同一个大型父阵列上的运行速度令人无法接受。
在不改变recursionlimit的情况下改进此代码的任何想法?
谢谢。
很抱歉没有样本数据,这是一个非常大的数据(10000+),所以这里有一个小函数的样本。
例如,
parent=[0,0,2,1,2]
getParent(3)
会将0
作为结果
由于第4个元素(0-base)的父元素是第2个元素,第2个元素的父元素是第1个元素
这样,3 - > 1 - > 0
答案 0 :(得分:2)
你没有给我们任何数据来测试它,所以我假设@Cel Skeggs在她的评论中找出了关键的区别。充实她的建议(但未经测试,因为 - 再次 - 你没有提供数据):
def getParent4(table):
chain = []
while table != parent[table]:
chain.append(table)
table = parent[table]
for link in chain:
parent[link] = table
return table
但是你看到的速度差异并没有多大意义,除非你在顶层多次调用该函数 - 在这种情况下,折叠路径可以产生巨大的差异。但是,你没有说什么; - )