我的递归/迭代方法的任何替代或改进?

时间:2016-06-01 00:36:47

标签: python algorithm python-3.x recursion genetic-algorithm

我正在尝试使用python 3编写父搜索代码。

Parent是一个基于0的数组,包含该元素的父元素。 例如,parent = [0,0]表示

  1. 第一个元素的父亲本身就是。

  2. 第二个元素的父元素是第一个元素,因此是第二个元素 value等于第一个元素的值

  3. 首先,我尝试使用递归方法。

    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

1 个答案:

答案 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

但是你看到的速度差异并没有多大意义,除非你在顶层多次调用该函数 - 在这种情况下,折叠路径可以产生巨大的差异。但是,你没有说什么; - )