我有两个伪代码算法:
RandomAlgorithm(modVec[0 to n − 1])
b = 0;
for i = 1 to n do
b = 2.b + modVec[n − i];
for i = 1 to b do
modVec[i mod n] = modVec[(i + 1) mod n];
return modVec;
第二
AnotherRecursiveAlgo(multiplyVec[1 to n])
if n ≤ 2 do
return multiplyVec[1] × multiplyVec[1];
return
multiplyVec[1] × multiplyVec[n] +
AnotherRecursiveAlgo(multiplyVec[1 to n/3]) +
AnotherRecursiveAlgo(multiplyVec[2n/3 to n]);
我需要分析这些算法的时间复杂度: 对于第一个算法我得到第一个循环是在O(n),第二个循环有一个最好的情况和最坏的情况,最好的情况是我们有O(1)循环运行一次,最坏的情况是我们有一个大n在第一个循环中,但我不知道如何将这个想法写成时间复杂度因为我通常得到b = sum(从1到n-1)的2 ^ n-1。 modVec [n-1]我被困在这里。
对于第二个循环,我只是不知道如何解决这一个的时间复杂度,我们通常依赖于n,所以我们需要我想的公式。
感谢您的帮助。
答案 0 :(得分:0)
第一个问题有点奇怪,好吧。 如果有帮助,请将 modVec 设想为1和0的数组。 在这种情况下,第一个循环将此数组转换为值。 这是 O(n)
例如,(1,1,0,1,1)将产生b = 27。
您的第二个循环运行 b 次。 b值的主导项是 2 ^(n-1),a.k.a。 O(2 ^ n)。您在循环中执行的任务是 O(1)。
第二个循环 依赖于 n 。你的基本情况是一个简单的乘法, O(1)。递归步骤有三个术语:
正如您的二进制分区导致 log [2] 复杂性一样,这个会导致 log [3] 。基地并不重要;系数(两个递归调用)不是'物。 2 * O(log3)仍然是 O(log N)。
这会促使您找到解决方案吗?
答案 1 :(得分:-1)
First Loop
对我而言,归结为O(First-For-Loop)+ O(Second-For-Loop)。
O(First-For-Loop)很简单= O(n)。
O(Second-For-Loop)有趣地取决于n。因此,对我来说它可以描述为O(f(n)),其中f(n)是n的某个函数。不完全确定我是否根据所提供的代码理解f(n)。答案因此变为O(n)+ O(f(n))。这可以归结为O(n)或O(f(n)),这取决于哪一个更大且更具优势(因为低阶项在大O符号中无关紧要。
第二次循环
在这种情况下,我看到每次调用该函数都会调用另外3个调用...
第一个电话似乎是O(1)电话。所以没关系。
第二次和第三次调用似乎是在履行该功能。 因此,每个函数调用都会导致2次额外的递归。
因此,时间复杂度为O(2 ^ n)。