【问题标题】:Python - What is the space complexity when tuple swap is used in bubble sorting?Python - 在冒泡排序中使用元组交换时的空间复杂度是多少?
【发布时间】:2017-11-11 18:10:46
【问题描述】:

考虑以下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),因为创建了一个元组?

【问题讨论】:

  • 你是在问元组交换是否在排序操作中占用少量的、恒定的内存?
  • 是的。通常,交换中使用的temp 变量是指定O(1) 的原因,因为它是使用的额外内存。我试图在这里找到temp 的对应对象。

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


【解决方案1】:

实际上,交换已被优化(至少在 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 充当临时变量。

【讨论】:

  • 如果没有创建元组,是否有任何额外的内存使用来保持它O(1)。我知道即使那样也会有一些内存使用,但我们是否将其指定为O(1)?如何证明这一点?
  • 我知道它不会比O(1) 更复杂。在这种情况下,我试图弄清楚究竟是什么内存定义或构成了O(1)
  • @skr_robo 我添加了更多细节。 ROT_TWO 操作码是实际执行交换的代码。无需分配额外的内存。
  • 既然没有使用额外的内存,为什么要说O(1)。是因为根据定义,这是最好的复杂性吗?
  • 好的。知道了。感谢您的耐心和清晰的解释。
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 2012-11-23
  • 1970-01-01
  • 2018-07-23
  • 2021-04-11
  • 1970-01-01
  • 2015-06-15
  • 2015-05-17
相关资源
最近更新 更多