用FLOOR求解给定算法的递推方程

时间:2014-10-02 03:09:48

标签: algorithm

你好我完全迷失了如何找到与给定算法相关的递推方程。

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; 任何帮助将不胜感激。

谢谢。

2 个答案:

答案 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不在数组中。