对于下面的伪码,最糟糕的时间复杂度大O表示法是什么?(假设函数调用是O(1)),我对大O表示法非常陌生,所以我不确定答案,但我认为O(log(n))是因为while循环参数每次乘以2,还是仅仅是O(loglog(n))?还是我在这两方面都错了?任何输入/帮助都是值得赞赏的,我正试图掌握最糟糕的时间复杂度的大O表示法的概念,我刚刚开始学习。谢谢!
i ← 1
while(i<n)
doSomething(...)
i ← i * 2
done
请注意,我没有“问题”,我也不是在寻找“另一种方法来找到我的算法的大O”。
我想知道的是,是否有可能写一个程序,你可以传递数据点,所有的数据点都是,对不同输入大小的算法的性能测量:,(n,time taken to solve problem for n),这将决定你算法的复杂度。
例如,输入可能是什么(它可能更大,这只是一个示例,这不是问题的重点):
36 000 took 16 ms
109 000 took 21 ms
327 000 took 68 ms
984 000 took 224 ms
2 952 000 took 760 ms
8 857 000
通常情况下,当处理组合时,大O复杂度似乎是O(n选择k)。在此算法中,我将在数组中生成与目标和匹配的所有组合:
def combos(candidates,start, target):
if target == 0:
return [[]]
res = []
for i in range(start,len(candidates)):
for c in combos(candidates, i+1, target-candidates[i]):
res.append([candidates[i]]+ c)
不知道这是不是适合这类问题的地方,但现在开始了。根据下面的代码,有多少个基本操作,每个操作执行多少次。这个运行时间的大O符号是什么?这是MATLAB中的,如果有关系的话。
total = 0;
for i = 1:n
for j = 1:n
total = total + j;
end
end
我的想法是,对于每个n,j= 1:n循环运行一次。在j= 1:n循环中有n个计算。对于j= 1:n循环,它的n^2。在i= 1:n循环内运行n次,所以计算的总数是n^3,大的O值是O(N^3)。这是正确的吗?
我刚开始在一个数据结构课,教师已经张贴了10个问题,并询问其中一个大O。根据我读过的文章,我假设这段代码的大O将是O(1),因为数据参数是单个数据元素。但是,它确实执行了多次,这取决于数字的大小,所以这会使它成为O(N)吗?
public class Main {
public static void main(String[] args) {
f(100000);
}
public static long f (int n) {
long sum = 0;
for (long i = 2; i < n; i =