【问题标题】:Understanding recurrence for running time了解运行时间的重复
【发布时间】:2013-09-19 10:43:16
【问题描述】:

我正在做 CLRS 的算法简介中的练习。这不是评分作业或任何东西,我只是想了解这个问题。

问题如下:

我们可以将插入排序表示为递归过程,如下所示。在 为了对 A[1..n] 进行排序,我们递归地对 A[1..n-1] 进行排序,然后 然后将 A[n] 插入已排序的数组 A[1..n-1]。写一个 此递归版本插入的运行时间的重复 排序。

问题的解决方法:

因为在最坏的情况下将 A[n] 插入到 排序数组 A[1. .n -1],如果 n = 1,我们得到递归 T(n) = O(1) , T(n−1)+ O(n) 如果 n > 1 。这个递归的解是T(n) = O(n^2)。

所以我知道如果 n=1,那么它已经排序,因此需要 O(1) 时间。 但我不明白复现的第二部分: O(n) 部分是我们将要排序的元素插入到数组中的步骤,这在最坏的情况下需要 O(n) 时间——在这种情况下,我们必须遍历整个数组并在其末尾插入。

我无法理解它的递归部分 (T(n-1))。 T(n-1) 是否意味着每次递归调用我们都在对数组中的一个元素进行排序?这似乎不对。

【问题讨论】:

    标签: algorithm sorting recursion recurrence


    【解决方案1】:

    是的,它来自:

    为了对 A[1..n] 进行排序,我们递归地对 A[1..n-1] 进行排序,然后 将 A[n] 插入已排序的数组 A[1..n-1]

    “递归排序 A[1..n-1]”部分需要 T(n-1) 时间(这很简单:我们定义 T(n) 表示“对 n 个元素进行排序所需的时间”,因此对 n-1 个元素进行排序所需的时间通常为 T(n-1)),而“将 A[n] 插入已排序的数组 A[1..n-1 ]" 部分需要(最坏情况)O(n) 时间。将它们加在一起得到

    T(n) = T(n-1) + O(n)

    【讨论】:

      【解决方案2】:

      我将解释我对使用递归的插入排序的python代码的理解如下:

      def insert_sort_r(A,n)

      if n==1:
      
          pass
      
      else:------------------------------------ c1
          insert_sort_r(A,n-1) ---------------- T(n-1)
      
          key = A[n-1]------------------------- c2
          i = n-2 ------------------------------c3
      
          while i>-1 and A[i] > key:------------c4*(n)
              A[i+1] = A[i]---------------------c5*(n-1)
              i = i-1---------------------------c6*(n-1)
          A[i+1] = key--------------------------c7
      

      每一步所用的时间由“c”值表示,同时还显示了所用的步数。我们将步骤“insert_sort_r(A,n-1)”中对 (n-1) 个元素进行排序所花费的时间表示为 T(n-1),因为我们不知道这个值在 n 方面的确切含义。这就是递归的思想。用值是(n-1)的情况来表示值是n的情况的方程。

      【讨论】:

      • 这个答案有点乱。格式混乱,不清楚您要表达什么。
      • 请说明您不理解该解释的哪一部分,以便我详细说明。
      • “格式混乱,不清楚你想表达什么。”
      • 我希望现在格式清晰。所以问题是他不理解n>1时的情况。对于 n>1,运行时间方程有两部分。一个是 T(n-1),另一个是 O(n)。所以我所做的是展示这两个部分是如何在 python 代码的帮助下实现的。而且,一旦你解决了这个递归,就会发现它的解决方案是一个二次多项式,这就是为什么总运行时间是 O(n^2)。希望你现在清楚这一点。如果你想看看递归是如何解决的,请告诉我。
      • 解释和澄清应该在答案的正文中。可以删除评论。即,不要向解释。向每个人解释。
      猜你喜欢
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多