你好我完全迷失了如何找到与给定算法相关的递推方程。
C(i, j, x)
if i=j then
if A[i] = x
return YES
else
return NO
else
if C(i, floor((i+j)/2), x) = YES
return YES
else
return C(floor((i+j)/2) + 1, j, x)
我得到的那个if语句你会算作1.但我迷失了如何得到递归调用返回C(floor((i + j)/ 2)+ 1,j的递推方程, x)的
MY结束尝试将是t(n)= T(n / 2 +1)+ 3; 任何帮助将不胜感激。
谢谢。
答案 0 :(得分:1)
C
时, NO
进行两次递归调用,因此重现应为
T(n) = T(ceiling(n/2)) + T(floor(n/2)) + 3.
在这里,我通过尝试一些小例子,在右侧制定了T
的论点。
C(1, 5, x) => C(1, 3, x) and C(4, 5, x)
C(1, 6, x) => C(1, 3, x) and C(4, 6, x)
事实上,如果你准备将主定理应用于像这样的重复,那么涉及地板和天花板的精确陈述几乎不重要。关于主定理的更一般的陈述Akra--Bazzi指出,在你可能遇到的所有情况下,递归调用的参数中的一点模糊性不会改变渐近分析。在这种情况下,T
是
T'
的大-Theta
T'(n) = T'(n/2) + T'(n/2) + 3.
答案 1 :(得分:0)
这似乎回答了问题'数组是否包含x?'。它以递归方式搜索数组的下半部分,然后递归地搜索数组的上半部分,直到找到X或检查了所有索引,并且可以说它不在数组中。
因此,T(n)= 2T(n / 2)+ 3,这是主定理的O(n)。因为你必须在最坏的情况下检查所有指数,然后说“是”'或者'否'。
考虑x不在数组中的情况(我们只使用A [i] = i作为10个索引0到9的数组)
x = 10
i = 0, j = 9
0. C(0, 9, 10)
i != j
1. C(0,4,10)
i != j
2. C(0,2,10)
i != j
3. C(0,1,10)
i != j
4. C(0,0)
i == j
A[i] != 10: Return NO.
From 3. else:
5. C(1,1, 10)
i == j
A[i] != 10: Return NO
From 2. else:
6. C(2,2,10)
i == j
A[i] != 10: Return NO
From 1. else:
7. C(3,4,10)
i != j
8. C(3,3,10)
i == j
A[i] != 10: Return NO
From 7. else:
9. C(4,4,10)
i == j
A[i] != 10: Return NO
From 0. else:
10. C(5, 9, 10)
i != j
11. C(5, 7, 10)
i != j
12. C(5, 6, 10)
i != j
13. C(5, 5, 10)
i == j
A[i] != 10: Return NO
From 12. else:
14. C(6, 6, 10)
i == j
A[i] != 10: Return NO
From 11. else:
15. C(6, 7, 10)
i != j
16. C(6, 6, 10)
i == j
A[i] != 10: Return NO
From 15. else:
17. C(7, 7, 10)
i == j
A[i] != 10: Return NO
From 10. else:
18. C(8, 9, 10)
i != j
19. C(8, 8, 10)
i == j
A[i] != 10: Return NO
From 18. else:
20. C(9, 9, 10)
i == j
A[i] != 10: Return NO
10. Recieves No from all branches, returns No
0. Recieves No from all branches, returns No.
最终导致20个递归调用,你可以看到算法必须检查每个索引,以确定' 10不在数组中。