【问题标题】:What is the time complexity of Python List Reverse?Python List Reverse 的时间复杂度是多少?
【发布时间】:2016-06-03 04:50:03
【问题描述】:

我已经看到了这个页面https://wiki.python.org/moin/TimeComplexity,但我没有看到reverse() 的列表功能。 listreverse()的时间时间复杂度是多少?

我的时间实验表明,对于较大的尺寸,它是O(n)。谁能确认一下?

timeit 反转大小列表的时间

   10    .1027
  100    .2347
 1000    .6704
10000   6.204
20000  12.9

【问题讨论】:

    标签: python list time-complexity


    【解决方案1】:

    是的,你是对的,它是 O(n),其中 n - 列表的长度。 在这里查看更多信息:https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

    【讨论】:

      【解决方案2】:

      如果你查看reverse方法here的实现,那么它看起来如下:

      static PyObject *
      listreverse(PyListObject *self)
      {
          if (Py_SIZE(self) > 1)
              reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
          Py_RETURN_NONE;
      }
      

      所以,操作实际上是委托给reverse_slice。那么,我们来看看:

      static void
      reverse_slice(PyObject **lo, PyObject **hi)
      {
          assert(lo && hi);
      
          --hi;
          while (lo < hi) {
              PyObject *t = *lo;
              *lo = *hi;
              *hi = t;
              ++lo;
              --hi;
          }
      }
      

      所以,这里有 2 个索引最初设置在列表的开头和结尾。然后,在while 循环的每次迭代中,交换相应索引处的元素:

      PyObject *t = *lo;
      *lo = *hi;
      *hi = t;
      

      然后左边的索引递增,右边的索引递减:

      ++lo;
      --hi;
      

      只要右索引超过左索引,循环就会继续。因此,如果列表中有n 元素,则将执行n/2 迭代,因此时间复杂度为O(n)

      【讨论】:

      【解决方案3】:

      通过像 reverse() 这样的内置库或使用切片 a=a[::--] 来反转列表都将花费相同的时间,即 O(n)

      【讨论】:

        【解决方案4】:

        如果你看到算法很容易看出反向的时间复杂度是O(n)线性时间复杂度)其中n是列表中元素的编号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-17
          • 2021-08-03
          • 2016-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-24
          相关资源
          最近更新 更多