Algorithm 找不到正确的while大O&;if语句 inti=0; 而(i在第一次迭代中尝试访问位置99处的数组
我很困惑如何为这个算法找到正确的大O。Algorithm 找不到正确的while大O&;if语句 inti=0; 而(i在第一次迭代中尝试访问位置99处的数组,algorithm,big-o,Algorithm,Big O,我很困惑如何为这个算法找到正确的大O。 尽管我们将使用while循环总共进行N次, 如果nums[i]满足if语句的条件,我们将重复swap,直到不满足if语句 我们能说它的时间复杂度是O(N)吗? 或者最坏的情况是O(N^2) 这不是一个定义明确的问题。 它可以崩溃,也可以无限期地运行 崩溃: Input=[100,1]-->在第一次迭代中尝试访问位置99处的数组 无限运行: Input=[2,3,4,5]-->每次迭代都会得到if条件。对于i==0,数组中没有等于1的元素(即i+1),因为所
尽管我们将使用while循环总共进行N次,
如果nums[i]满足if语句的条件,我们将重复swap,直到不满足if语句 我们能说它的时间复杂度是O(N)吗?
或者最坏的情况是O(N^2) 这不是一个定义明确的问题。 它可以崩溃,也可以无限期地运行 崩溃: Input=[100,1]-->在第一次迭代中尝试访问位置99处的数组 无限运行:
Input=[2,3,4,5]-->每次迭代都会得到if条件。对于i==0,数组中没有等于1的元素(即i+1),因为所有数组元素都是不同的,所以无论它们如何交换,都不会出现其中一个元素等于另一个元素的情况。考虑到这一点,当i==0时,循环将无限运行。我同意这个问题没有很好的定义。也许这篇文章没有包括一些背景。仔细阅读代码后,很明显这是一个排序算法(一个奇怪的算法)。通过访问数组索引的方式,我认为算法期望大小为N的数组
nums
填充1…N的整数,不一定按顺序排列,并且可以重复
关于SomeWittyUsername的观点,我们就说元素不会导致无限循环,等等
我对代码做了一个简短的注释
int i=0;
while(i < N){
if(nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]){
// swap
int tmp = nums[i];
nums[i] = nums[tmp - 1];
nums[tmp - 1] = tmp;
} else {
i++;
}
}
inti=0;
而(i
看起来最佳情况下的场景nums
已初步排序,算法在O(N)时间内工作
但既然大O符号是指最坏的情况。。。我最好的答案是:它也是O(N),但系数更高。它不是O(N^2),因为每次它遇到一个放错位置的元素时,它都会把它放在正确的位置。当你得到if-else的渐近计算结果时,看看大O的最坏情况。这意味着第一个if可以是O(N^2),正如你所说的。所以,它是O(n^2)。问得好+1(小调除外:答案最好不要针对其他答案,甚至问题作者——它们主要面向未来的读者。我倾向于不鼓励针对特定用户的对话项目。你可以在得到50分后使用评论。)
int i=0;
while(i < N){
if(nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]){ // 1) check if it's in the right place 2) check if the potential swap will have no effect because of a repeat.
// Swap nums[i] with nums[nums[i]-1]
// Why swap these two values?
// This effectively places num[i] where it should be in the array
int tmp = nums[i];
nums[i] = nums[tmp - 1];
nums[tmp - 1] = tmp;
} else {
// The element is in the correct spot
i++;
}
}