Arrays 检查数组是否未排序的最佳时间复杂度
在检查给定数组是否未排序时,我试图找出最佳情况下的时间复杂度 我认为,这是检查数组是否已排序的最快方法,对于这个数组,时间复杂度应该是O(n)Arrays 检查数组是否未排序的最佳时间复杂度,arrays,algorithm,sorting,time-complexity,Arrays,Algorithm,Sorting,Time Complexity,在检查给定数组是否未排序时,我试图找出最佳情况下的时间复杂度 我认为,这是检查数组是否已排序的最快方法,对于这个数组,时间复杂度应该是O(n) for (i = 0; i < a.length-1; i++) { if (a[i] < a[i + 1]) { return true; } else { return false; } } (i=0;i
for (i = 0; i < a.length-1; i++) {
if (a[i] < a[i + 1]) {
return true;
} else {
return false;
}
}
(i=0;i
if(a[i]
还是我错了?是的,这需要O(n)
,它是
此外,您需要更改以下内容:
for (i = 0; i < a.length; i++)
for(i=0;i
为此:
for (i = 0; i < a.length - 1; i++)
for(i=0;i
由于您访问a[i+1
并且不想越界。此外,您的返回语句应该交换。用于检查数组是否未排序的算法的平均和最坏情况复杂度是O(N)
。但是最佳情况复杂度是O(1)
最好的情况发生在数组的前两个元素无序时。这在第一次循环迭代中被检测到,并且无论N
如何,都需要一个恒定的时间。只有当您尝试访问a[i+1]时,这才可能引发错误
对于最后一个数组元素…循环应该只运行i
(或者从1开始,然后与a[i-1]
比较)。您的代码没有考虑正确的数组边界(条件应该是i+1
),并且您不应该在循环内部返回true
,因为您应该测试所有元素。@CBroe对于a[i+1],代码将超出边界(UB)
但它永远不会超过第一次迭代。这个问题不是要求最快的算法来查找数组是否已排序,而是要求最好的案例复杂度。投票重新打开。@Henkholtman将一个问题称为完全的火车失事应该很容易。代码块有一个小错误,并且已更新。问题的逻辑是nee答案不是代码块本身这会更好:for(i=0;i+1
为什么@DAle?请解释。为了避免在a.length==0
@DAle的情况下可能出现无限循环,只有a.length-1
未签名时才会出现问题,因此可能会下溢为一个非常大的数字。如果有签名,则需要检查0<-1
,这是错误的,因此循环会立即中断(Java就是这种情况,这段代码看起来像这样)@Dukeling,谢谢你的澄清!我知道这段代码看起来像Java代码,在Java中没有这样的问题。但有可能这是另一种语言,这就是我写“可能”的原因。我更喜欢在Java中使用循环的I+1
形式。只是不想强迫读者去思考签名的/unsigned/underflow员工。