• 数学归纳法


    数学归纳法:如何用数学归纳提升代码的运行效率?

    “归纳”,是一种从经验事实中找出普遍特征的认知方法。

    • 通过上面的表格,我们可以进行归纳,并得出这样的结论:
    • 如果一个动物,身上长羽毛并且会飞,那么就是属于鸟;
    • 如果一个动物,身上长绒毛、不会飞、而且吃小鱼和老鼠,那么就属于猫。

    什么是数学归纳法?

    根据这个观察,我们是不是可以大胆假设,前 n 个格子的麦粒总数就是 2^{n}-1 呢?如果这个假设成立,那么填满 64 格需要的麦粒总数,就是 1+2+2{2}+2{3}+2^{4}+……+ 2^{63}
    =2^{64}-1=18446744073709551615。

    数学归纳法的一般步骤是这样的:

    证明基本情况(通常是 n=1 的时候)是否成立;

    假设 n=k-1 成立,再证明 n=k 也是成立的(k 为任意大于 1 的自然数)。

    第一个子命题是,第 n 个棋格放的麦粒数为 2^{n-1}。第二个子命题是,前 n 个棋格放的麦粒数总和为 2^{n}-1。

    基本情况:我们已经验证了 n=1 的时候,第一格内的麦粒数为 1,和 2^{1-1} 相等。因此,命题在 k=1 的时候成立。

    假设第 k-1 格的麦粒数为 2^{k-2}。那么第 k 格的麦粒数为第 k-1 格的 2 倍,也就是 2^{k - 2}*2=2^{k-1}。因此,如果命题在 k=n-1 的时候成立,那么在 k=n 的时候也成立。

    基本情况:我们已经验证了 n=1 的时候,所有格子的麦粒总数为 1。因此命题在 k=1 的时候成立。

    假设前 k-1 格的麦粒总数为 2^{k-1}-1,基于前一个命题的结论,第 k 格的麦粒数为 2^{k-1}。那么前 k 格的麦粒总数为 (2{k-1}-1)+(2{k-1})=2*2{k-1}-1=2{k}-1。因此,如果命题在 k=n-1 的时候成立,那么在 k=n 的时候也成立。

    和使用迭代法的计算相比,数学归纳法最大的特点就在于“归纳”二字。它已经总结出了规律。只要我们能够证明这个规律是正确的,就没有必要进行逐步的推算,可以节省很多时间和资源。

    从这个图可以看出,函数从 k=63 开始调用,然后调用 k-1,也就是 62,一直到 k=1 的时候,嵌套调用结束,k=1 的函数体开始返回值给 k=2 的函数体,一直到 k=63 的函数体。从 k=63, 62, …, 2, 1 的嵌套调用过程,其实就是体现了数学归纳法的核心思想,我把它称为逆向递推。而从 k=1, 2, …, 62, 63 的值返回过程,和上一篇中基于循环的迭代是一致的,我把它称为正向递推。

    总结

    数学归纳法在理论上证明了命题是否成立,而无需迭代那样反复计算,因此可以帮助我们节约大量的资源,并大幅地提升系统的性能。
    数学归纳法实现的运行时间几乎为 0。不过,数学归纳法需要我们能做出合理的命题假设,然后才能进行证明。

  • 相关阅读:
    MySQL-LSN
    MySQL Binlog三种格式介绍及分析
    MySQL中的seconds_behind_master的理解
    MySQL的四种事务隔离级别
    pt-table-sync修复mysql主从不一致的数据
    MySQL主从不同步、数据不一致解决办法
    nginx的应用【静态代理、动静分离】
    Redis数据缓存淘汰策略【FIFO 、LRU、LFU】
    Java基本知识点o(1), o(n), o(logn), o(nlogn)的了解
    JS函数篇【2】
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/12658031.html
Copyright © 2020-2023  润新知