【问题标题】:Algorithm complexity calculations算法复杂度计算
【发布时间】:2013-11-01 04:56:09
【问题描述】:

我开始学习如何用 c 编写代码。 目前,我正在尝试实现一个程序,该程序将显示类似于此的输出:

{ 欢迎使用 CSE 分拣系统


请输入您的数组大小:
请选择以下排序算法之一:
1 - 冒泡排序
2 - 插入排序
3 - 选择排序
4 - 快速排序
您的选择:

您的数组已使用选择排序进行了 x 步排序。

排序后的数组:}

我的程序已基本完成,但我无法确定如何计算排序过程中使用的 x 步数。如何推断算法使用的“步数”?

【问题讨论】:

  • 计算你用每种算法做了多少次交换?
  • @GWW,对,但是交换的数量不取决于将数字输入数组的顺序吗?即,如果它们按升序输入,将进行 0 次交换。
  • @keyhammer:是的,没错。 (至少,对于冒泡排序。其他的工作方式不同。)这就是为什么我们通常讨论排序算法的“最坏情况复杂度”,这是用于 any 输入的最大步数给定长度。
  • @ruakh 交换不是排序的主要因素; 比较是。
  • @WhozCraig 因此,如果比较是主要因素,那么只要数组大小不变,每个排序步长是否会保持不变,而与输入元素的顺序无关?

标签: c arrays algorithm sorting


【解决方案1】:

程序的复杂度不能通过简单地计算每个程序执行的指令总数来比较。您需要渐近分析、摊销分析等来分析算法的复杂性。在渐近分析中分析算法的限制行为

限制行为仅对 n ≥ n0 有效。快速排序的渐近 Big-O 复杂度为 O(n log n),小于具有 O(n2) 的冒泡排序的复杂度强>。但是对于 n 0 的任意值,即使在平均情况下,冒泡排序也可能会执行快速排序。因此,您计算执行以比较程序的指令总数的方法可能不会产生正确的结果。

【讨论】:

    【解决方案2】:

    对于复杂性表示法,请转至here

    对于复杂度计算示例,请转至here

    这两节课都用非常简单易懂的语言进行了解释

    【讨论】:

      【解决方案3】:

      这听起来很有趣,但解决起来有些困难。 “步骤”本身就非常抽象。

      假设我有一些任意排序功能:

      void lameSort(int* array, int length) {
        int i;
        for (i = 0; i < length; ++i) {
          if (array[i] == 5) {
            int tmp = array[i];
            array[i] = array[i - 1];
            array[i - 1] = tmp;
          }
        }
      }
      

      您将“步骤”具体定义为什么?你可以说

      • 初始化索引 = 1 步

      • 将每个数组元素与 5 = n 步(数组长度)进行比较

      • 初始化临时变量 = 1 步

      • ...等

      您必须以某种方式计算这些“步骤”中的每一个。

      而且,人们通常不会根据确切的步骤来衡量算法的复杂性。它们用 Big-O 表示法表示运行时间/存储复杂性,最高阶多项式是运行时间。

      【讨论】:

      • 您的“分配”是编译时操作,等于零步
      • 哎呀——意思是初始化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2012-12-31
      相关资源
      最近更新 更多