Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 找不到正确的while大O&;if语句 inti=0; 而(i在第一次迭代中尝试访问位置99处的数组_Algorithm_Big O - Fatal编程技术网

Algorithm 找不到正确的while大O&;if语句 inti=0; 而(i在第一次迭代中尝试访问位置99处的数组

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),因为所

我很困惑如何为这个算法找到正确的大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),因为所有数组元素都是不同的,所以无论它们如何交换,都不会出现其中一个元素等于另一个元素的情况。考虑到这一点,当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++;
        }
    }