Big O操作(提供的尝试答案)

时间:2014-03-16 07:51:31

标签: algorithm loops operating-system big-o complexity-theory

  

描述任何需要O(1)时间的操作。

以上几乎是一个问题(技术上我不知道),但它是我被要求做的事情。我的答案如下:

O(1)操作可能是在一个恒定的时间内运行一个循环,例如:

Sum = 0;
for (int i = 0; i < 10; i++) {   // i<10 runs 11 times, i++ runs 10 times
Sum++;                           //sum++ runs 10 times
}

以上是一种算法,所以不需要太过技术性的编码:) 总操作次数:

sum = 0;           //runs 1 time  
for (int i=0;      // runs 1 time  
i<10;              //runs 11 times  
i++;               //runs 10 times  
sum++              //runs 10 times 

上述算法的时间复杂度为O(1),因为操作运行的时间非常长。如果我们要运行循环n次(例如i&lt; n) - 其中n等于数组中元素的数量 - 那么复杂度将是O(N)因为那么循环将运行n次意味着迭代循环与数组中的数据输入成正比(我知道我没有在代码中实现数组,但这只是让你想到这种方法)。
它不是家庭作业等。我已经找到了解决方案,甚至试图找出O(N)的复杂性...你的帮助,解决方案将不胜感激。

抱歉我缺乏知识(如果我错了)。

3 个答案:

答案 0 :(得分:3)

这个答案旨在向您展示另一个时间复杂度。

请注意,在谈论时间复杂度时,您还需要指定所使用的分析,O(1)时间复杂度可能会根据您所要求的分析而有很大差异。

查看代码快照:

r = 1
while (r == 1):
   r = rand(2) //random number: 0 or 1
   //do some O(1) things

以上代码将在O(1) 平均时间内运行。为什么?因为调用循环k(或更多)次的概率是1/2^(k-1)
这给了我们

的复杂性
CONST*1/2 + CONST*1/4 + ... + CONST*1/2^(k-1) + ... =
= CONST* (1/2 + 1/4 + ... + 1/2^(k-1) + ... )
<= CONST * 1 

因此,我们得到的循环确实是平均案例分析的O(1)运行时间,但很容易看出每次t运行时间的概率为p>0将超过t - 向我们提供O(infinity) 最坏情况

答案 1 :(得分:0)

我会给你最简单的例子: 考虑给你一个n个元素的数组,并要求你返回数组中的第k个元素k

代码:

int function(int arr[], int n)
{ 
    int k;
    scanf("%d", &k);
    return arr[k];
}

O(1)复杂性问题的其他例子可以是: 1)将元素添加到堆栈(或队列)的顶部 2)从堆栈(或队列)中删除元素 3)在前面的链表中插入元素 4)删除链表前面的元素

还有更多......

答案 2 :(得分:0)

O(1)操作是一个不依赖于输入大小的恒定时间操作。

因此,例如,如果您将采用大小为N的数组并输出5个第一个元素的总和,则它将在O(1)时间内运行。