Python - 在泡泡排序中使用元组交换时的空间复杂度是多少?

时间:2017-06-09 16:26:09

标签: python tuples swap bubble-sort space-complexity

考虑以下bubble sort计划:

arr = map(int, raw_input().split(' '))
print "Unsorted: \n{arr_name}".format(arr_name = arr)

for j in range(len(arr) - 1, 0, -1):
    for i in range(j):
        if (arr[i] > arr[i + 1]):
            arr[i], arr[i + 1] = arr[i +1], arr[i]

print "Sorted: \n{arr_name}".format(arr_name = arr)

通常使用temp变量进行排序,这意味着空间复杂度为0(1)。但我的理解是,元组交换只是将标识符重新分配给对象(link)。这需要额外的空间吗?这里的空间复杂性是多少?它仍然是O(1)因为创建了一个元组吗?

1 个答案:

答案 0 :(得分:2)

实际上交换得到优化(至少在CPython中),这样就不会创建任何元组:

>>> def f():
...     a,b = b,a
... 
>>> dis(f)
  2           0 LOAD_FAST                0 (b)
              3 LOAD_FAST                1 (a)
              6 ROT_TWO             
              7 STORE_FAST               1 (a)
             10 STORE_FAST               0 (b)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE 

仍然是O(1),是的。即使创建了一个元组,它仍然是O(1),因为在执行交换后可以立即释放元组。

正在使用的唯一额外内存是用于保存要交换的值的堆栈空间(这可能甚至不是任何额外的,因为没有交换的最大堆栈深度可能已经足够)。然后,ROT_TWO操作码执行交换:

    TARGET(ROT_TWO) {
        PyObject *top = TOP();
        PyObject *second = SECOND();
        SET_TOP(second);
        SET_SECOND(top);
        FAST_DISPATCH();
    }

请注意,不需要使用额外的内存;简单地交换前两个堆栈元素。上面的topsecond充当临时变量。