【问题标题】:Best case time Complexity to check if the array is unsorted最佳情况时间检查数组是否未排序的复杂性
【发布时间】:2017-06-23 12:02:58
【问题描述】:

我试图在检查给定数组是否未排序时找出最佳情况时间复杂度。

我认为,这是检查数组是否已排序或未排序的最快方法,并且时间复杂度应该为 O(n)。

for (i = 0; i < a.length-1; i++) { 
  if (a[i] < a[i + 1]) {
    return true;
  } else {
    return false;
  }
}

还是我错了?

【问题讨论】:

  • 只有这可能会引发错误,当您尝试访问 last 数组元素的a[i + 1] 时......循环应该只为i &lt; a.length - 1 运行(或从 1 开始,然后与 a[i-1] 进行比较。)
  • 你的代码没有考虑到正确的数组边界(条件应该是i + 1 &lt; a.length),你不应该在循环内返回true,因为你应该测试所有元素。
  • @CBroe 对于a[i+1],代码超出范围 (UB),但它永远不会超过第一次迭代。
  • 这个问题不是要求最快的算法来查找数组是否已排序,而是要求最佳情况的复杂性。投票重新开放。
  • @HenkHolterman 应该很容易将一个问题称为火车失事。代码块有一个小错误,它已更新。问题的逻辑需要答案而不是代码块本身

标签: arrays algorithm sorting time-complexity


【解决方案1】:

是的,这需要O(n),它是as fast as it gets


此外,你需要改变这个:

for (i = 0; i < a.length; i++)

到这里:

for (i = 0; i < a.length - 1; i++)

因为您访问a[i + 1 并且您不想越界。此外,您的退货声明应该交换。

【讨论】:

  • 这样会更好:for (i = 0; i + 1 &lt; a.length; i++)
  • 为什么选择@DAle?请解释一下。
  • 避免a.length == 0时可能出现的无限循环
  • @DAle 只有当a.length-1 未签名并因此可能下溢到一个非常大的数字时才会出现问题。如果已签名,则需要检查 0 &lt; -1,这是错误的,因此循环将立即中断(Java 中就是这种情况,代码看起来像这样)。
  • @Dukeling,感谢您的澄清!我知道这段代码看起来像 Java 代码,Java 中没有这样的问题。但有可能这是其他语言,这就是我写“可能”的原因。即使在 Java 中,我也更喜欢使用 i + 1 形式的这个循环。只是不想强迫读者考虑那些签名/未签名/下溢的员工。
【解决方案2】:

算法检查数组是否未排序的平均复杂度和最坏情况复杂度为O(N)。但最佳情况复杂度O(1)

最好的情况发生在数组的前两个元素乱序时。这是在第一次循环迭代中检测到的,并且无论N 是多少,都会花费恒定的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2011-07-04
    • 2013-02-21
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多