列表展平的时间复杂度

时间:2018-03-14 20:06:10

标签: python algorithm

我有两个函数,它们都在Python中压缩任意嵌套的列表列表。

我想弄清楚两者的时间复杂性,看看哪个更有效率,但到目前为止我还没有找到任何确定的东西。关于列表列表有很多问题,但是没有关于嵌套的第n级。

功能1(迭代)

def flattenIterative(arr):
    i = 0

    while i < len(arr):
        while isinstance(arr[i], list):
            if not arr[i]:
                arr.pop(i)
                i -= 1
                break
            else:
                arr[i: i + 1] = arr[i]
        i += 1
    return arr

功能2(递归)

def flattenRecursive(arr):
    if not arr:
        return arr

    if isinstance(arr[0], list):
        return flattenRecursive(arr[0]) + flattenRecursive(arr[1:])
    return arr[:1] + flattenRecursiveweb(arr[1:])

我的想法如下:

功能1复杂性

我认为迭代版本的时间复杂度为O(n * m),其中n是初始数组的长度,m是嵌套量。我认为O(n)的空间复杂性,其中n是初始数组的长度。

功能2复杂性

我认为递归版本的时间复杂度为O(n),其中n是输入数组的长度。我认为O(n * m)的空间复杂性,其中n是初始数组的长度,而m是嵌套的深度。

摘要

所以,对我而言,似乎迭代函数较慢,但空间效率更高。相反,递归函数更快,但空间效率更低。这是对的吗?

1 个答案:

答案 0 :(得分:0)

我不这么认为。有N个元素,因此您需要至少访问一次元素。总的来说,您的算法将运行O(N)次迭代。决定因素是每次迭代

您的第一个算法有2个循环,但是如果仔细观察,它仍然会在每次迭代时迭代每个元素O(1)次。但是,正如@abarnert指出的那样,arr[i: i + 1] = arr[i]将每个元素从arr[i+1:]向上移动,再次是O(N)。

你的第二个算法是类似的,但你在这种情况下添加列表(在前一种情况下,它是一个简单的切片分配),不幸的是,列表添加在线性上是复杂的。

总之,您的算法都是二次的。