描述任何需要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)的复杂性...你的帮助,解决方案将不胜感激。
抱歉我缺乏知识(如果我错了)。
答案 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)时间内运行。