【问题标题】:Finding big-o time complexity of insertion sort查找插入排序的大 O 时间复杂度
【发布时间】:2015-08-25 16:17:22
【问题描述】:

这本书是这样计算插入排序的时间复杂度的:

令 T(n) 表示插入排序的复杂度,c 表示每次迭代中其他操作的总数,例如赋值和附加比较。因此,

T(n) = (2 + c) + (2 * 2 + c) + 。 . . + (2 * (n - 1) + c) ---> (1) = 2(1 + 2 + ... + n - 1) + c(n - 1) ---> (2) = 2((n - 1)n/2) + cn - c = n2 - n + cn - c ---> (3) = O(n2) ---> (4)

我无法理解第一步。每个学期的这个“2”是从哪里来的。

请让解释尽可能简单(数学很难)。

算法:

public class InsertionSort {
/** The method for sorting the numbers */
  public static void insertionSort(double[] list) {
    for (int i = 1; i < list.length; i++) {
    /** insert list[i] into a sorted sublist list[0..i-1] so that
       list[0..i] is sorted. */
       double currentElement = list[i];
       int k;
       for (k = i - 1; k >= 0 && list[k] > currentElement; k--) {
         list[k + 1] = list[k];
       }

       // Insert the current element into list[k+1]
       list[k + 1] = currentElement;
    }
  }
}

【问题讨论】:

  • 提供算法;它可以帮助更好地解释2
  • @Colin 我已经提供了算法。

标签: java big-o insertion-sort


【解决方案1】:

2 是一个可能的定义。算法的处理分为类似的步骤。你可以说他在for循环中一步计算比较,一步赋值。

此外,您会看到您有一个嵌套循环。因此,为了更好地阅读,我将外部循环命名为 i-loop 和内部循环 j_i-loop。处理 j_i-loop 的时间是2 * (i -1)。处理 i-loop 的时间就是处理(j_1-loop +c)+(j_2-loop +c)+...+(j_n-loop+c) 的时间。

现在你在第一行得到了这个词。

【讨论】:

  • 作者说,“c表示每次迭代中其他操作的总数,例如赋值和附加比较。”所以赋值操作已经被 'c' 处理了
  • 是的,“附加”比较。这里 c 代表你需要处理的时间:double currentElement = list[i]; int k;list[k + 1] = currentElement; 而且你需要处理 j-loop 的时间是可变的。因此,您不能为此值使用常量
猜你喜欢
  • 2021-05-30
  • 2013-11-18
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多