【算法设计与分析】08 序列求和的方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_37375427/article/details/100854416

本篇文章学习数列求和的一些方法。这些方法对后面学习算法的时间复杂度非常有帮助。

1. 数列求和公式

下面这几个数列求和公式都是高中学过的公式。

  • 等差、等比数列和调和级数

在这里插入图片描述

下面给出一个求和的例子,使用了一些高中都会的变换的技巧:

在这里插入图片描述

学习上面的公式,主要是为了解决算法的时间复杂度,下面以二分搜索的时间复杂度为例,讲解如何利用上面的公式求解出,时间二分搜索的时间复杂度(关于时间复杂度的概念,可以参看以前的文章:【算法设计与分析】03 算法及其时间复杂度)。

1.1 二分搜索的时间复杂度求解

  • 假设二分数组为T[n],要搜索的数为:x。如下图是一个简单数组的搜索过程。

在这里插入图片描述
上述的二分搜索最终并没有找到要搜索的元素的位置。所以二分搜索的数据的输入情况,可以分为两种,一种是想要搜索的数x在数组中,一种是想要搜索的x不在数组中,那么一共就有2n+1中情况发生。如下图:

  • 左边是x在数组中,可以在任何一个位置出现,有n种情况。
  • 右边是x不在数组中,那么x出现在数组的两边或者在数组中两个元素的中间,就有n+1种情况
  • 所以一共有2n+1种输入情况。
    在这里插入图片描述

注意:上述,假设n=2k-1,只是为了方便后面的计算。

现在已经知道了总的输入,还需要知道总的输入对应的比较的次数,才能计算出时间复杂度。
由分析可以看出,比较t次的输入的个数为:

在这里插入图片描述

所以:

  • 对于t= 1,2…k-1,比较t次的输入有 :2t-1 个 (这个对应的是x在数组中的情况)
  • 对于x不在数组中的情况,需要比较的次数是k,那么比较k次的输入就是:2k-1+n+1个。(式子中的n+1是对应的不在数组中非空隙的个数,2k-1 对应的是x在数组中的情况,因为就算要找的数不在数组中,也要将数组比较完全一遍才能够知道)

那么总次数就等于:对每个输入乘以这个输入对应的次数并求和

假设n=2k-1 ,各种输入的概率相等,则二分搜索平均时间复杂度为A(n):

在这里插入图片描述

上述的计算过程用到了一开始学习的几个公式以及变换技巧,自己慢慢掌握。

上述的计算结果大家都不陌生了,正式二分搜索的平均时间复杂度:logn

2 估计和式上届的放大法

放大法在高中大家学的都很熟练应该。

  • 放大法:

在这里插入图片描述

  • 放大法的例子

在这里插入图片描述

3 估计和式渐近的界

以下方法用到了基本微积分的概念。

求上届
在这里插入图片描述

求下届
在这里插入图片描述

上面的上届和下届都是同一个级别的,所以:

在这里插入图片描述

4 总结

本文学习了序列求和的基本公式:

  • 等差数列
  • 等比数列
  • 调和级数

对于无法计算的序列和,可以采用放大法求上届,用积分做和式渐近的界

这些基本的计算方法对计数循环过程的基本运算次数很有帮助。也就是算法的时间复杂度了。

猜你喜欢

转载自blog.csdn.net/qq_37375427/article/details/100854416