分治递归法中时间复杂度的推理

       时间复杂度的计算方法最直接的是count循环中语句执行的次数,如2个嵌套的for循环的时间复杂度就是当入参为n时,最大的循环执行为n2,但是其中执行的语句不只是一条,所以可能每次循环执行了c条,所以最终的循环执行次数为cn2;而时间复杂度的定义是小于等于(即大O定义),所以O(n2)≤cn2,Θ(n2)==cn2, Ω(n)>=cn2,(master定律)

        循环语句能更直观的计算时间复杂度,之前对于时间复杂度的概念和计算主要针对于循环条件算法,心中一直存在一个疑问:对于递归语句如何count语句执行的次数,如何计算时间复杂度?因为递归条件,你往往无法直接进行count语句执行的次数。递归中的时间复杂度是否存在,如何分析?

        回归到时间复杂度的最初定义计算:count语句执行的次数。

        在基于分治法的递归算法中,当前层面的语句执行次数=各分割下一层的次数+cn,如:4次分割中最外层的时间复杂度T(n)=4T(n/2)+O(n),这是根据递归的特点从整体思维出发得出的一个时间复杂度的递归推理式,那如何从该递归式推理出大O的时间复杂度呢?这里推理的一个关键是master定律,将O(n)替换为cn的不等式法:

                                                       T(n)=4T(n/2)+O(n)

因为 O(n)≤cn,

所以 T(n)=4T(n/2)+O(n)

        T(n)≤4T(n/2)+cn

这样将一个数量级转换为了可计算的表达式,然后应用数学的错位消除法就可计算得到最后的T(n)的精确表达式,则可直接得出数量级上的时间复杂度。下面是推理的过程:

分治递归法中时间复杂度的推理_第1张图片

 

       总结:通过分治法的分来归纳概括出T(n)的分治递推式T(n)=4T(n/2)+O(n),然后根据master定律,通过错位相减法推导出T(n)的精确表达式,最后得到时间复杂度。其中的关键转变是master定律。因此,不管分治递推的表达式的形式如何,只要根据master定律,然后根据错位相减法,就能推导出精确的T(n)表达式,即时间复杂度。

        类似的T(n)=3T(n/2)+O(n)可类推导出时间复杂度,注意该式的推理过程中的一个trick转换3^{log_{2}n}=n^{log_{2}3},因此在基于分治思想的算法中,只要概括出分治的递推式,就可以根据master定律推导出时间复杂度。其中分治的递推式的概括原则来源于递归思想:当前值等于子递归的返回,所以当前的时间复杂度T(k)=T(k/2)+T(k/2)+O(k),其中k的值是计算的数据量。

 

 

 

你可能感兴趣的:(Algorithm,Theory,Research,and)