【问题标题】:How to speed up recursive call on Python linked list?如何加快 Python 链表的递归调用?
【发布时间】:2014-05-21 15:03:46
【问题描述】:

我有一个名为min_max的递归函数;它传递了一个链表;它返回一个包含最小值和最大值的 2 元组。如果链表为空,则min_max 返回(None, None)。例如,如果我们将此函数称为min_max(list_to_ll([1, 3, 7, 2, 0])),则返回的结果将是(0, 7)

class LN:
    def __init__(self,value,next=None):
        self.value = value
        self.next  = next

def list_to_ll(l):
    if l == []:
        return None
    front = rear = LN(l[0])
    for v in l[1:]:
        rear.next = LN(v)
        rear = rear.next
    return front


def min_max(ll):
    if ll == None:
        return (None,None)
    else:
        result = (ll.value,ll.value)
        if ll.next != None:
            return (min(result[0],min_max(ll.next)[0]),max(result[1],min_max(ll.next)[1]))
        else:
            return result

if __name__ == '__main__':

    print('\nTesting min_max')
    print(min_max(None))
    print(min_max(list_to_ll([0])))
    print(min_max(list_to_ll([7, 3, 5, 2, 0])))
    print(min_max(list_to_ll([1, 3, 5, 2, 7])))

    values = [i for i in range(1,100)]
    print(values)
    print(min_max(list_to_ll(values)))

我的问题是如何加快可能有 100 个元素的链表上的递归调用 min_max?我可以通过与 5-7 个元素链接的 test_case,但是对于 100 个元素,我的函数效率不高。谢谢。

【问题讨论】:

  • 您的代码分别针对最小和最大情况遍历链表。您遍历两次就足够了。
  • 在这里使用递归吗?
  • @MartijnPieters WoW ...非常感谢,我能弄明白...

标签: python performance recursion linked-list


【解决方案1】:

目前,这一行:

return (min(result[0],min_max(ll.next)[0]),max(result[1],min_max(ll.next)[1]))

调用min_max 递归两次 来获得最小值和最大值-这意味着您将2**n 调用到min_max 而不是n,这是一个巨大的惩罚。相反,请考虑:

min_, max_ = min_max(ll.next) # call once
return min(min_, ll.value), max(max_, ll.value) # use the two values

【讨论】:

    猜你喜欢
    • 2020-09-08
    • 2018-03-30
    • 2013-05-24
    • 2019-02-26
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多