zoukankan      html  css  js  c++  java
  • 算法基础

    计算

    计算

      计算是最终的研究目标

    算法  

      计算 = 信息处理

        借助某种工具,遵照一定规则,以明确而机械的形式进行

      计算模型=计算机=信息处理工具

      所谓算法,即特定计算模型下,旨在解决特定问题的指定序列

        输入

        输出

        正确性

        确定性

        可行性

        有穷性

      程序未必是算法,我们偶尔会写出死循环程序,它就不是算法

    如何评价算法?

      正确

      健壮

      可读

      效率(最重要)

    计算模型

    性能测度

      To measure is to know. If you can not measure it,  you can not improve it.

                                        --  Lord Kelvin

    问题规模

      算法分析涉及正确性和成本,这里我们主要关注成本

      成本:运行时间 + 所需存储空间

      度量算法的时间成本、空间成本,现实中问题实例太多涉及多方面因素,所以我们需要归纳概括

      利用数学上的  划分等价类  我们将问题分类,然后去研究类

      问题实例的规模,往往是决定计算成本的主要因素

      问题规模接近,计算成本接近

    最坏情况

      令TA(n)= 用算法A求解某一问题规模为n的实例,所需的计算成本,有时简记为T(n)

      稳妥起见,T(n)应为最大计算成本

    理想模型

      为给出对算法的客观评判,需要抽象出一个理想的平台或模型不依赖于具体因素,直接而准确地描述,测 量并评价算法

       算法运行时间正比于算法需要执行的基本操作次数

       T(n) = 算法为求解规模为n的问题所需执行的基本操作次数

    大O记号

    主流长远

      以大视野去观察算法主要的长期表现

    大O记号

      

       Ω(f(n)) 代表算法长期下界

       Θ(f(n)) 介于上界和下界之间

    高效算法

      常数复杂度O(1):代码不含循环、调用、递归,即顺序执行。

      对数复杂度O(logn):复杂度无限接近于O(1)

    有效算法

      多项式复杂度O(n^k):通常认为已经可以接受  

    难解算法

      指数复杂度O(a^n):计算成本增长极快,不可忍受

      很多问题的指数算法是显而易见的,而设计出多项式算法却极难

         例:2 - subset问题

     DSA分析

      两个主要任务 = 正确性 + 复杂度

      分析复杂度的主要方法

        迭代:级数求和

        递归:递归跟踪 + 递推方程

        猜测 + 验证

      级数

        算数级数:与末项平方同阶

        幂方级数:比幂次高一阶

        几何级数:与末项同阶

        收敛级数:O(1)

       循环

        循环嵌套,复杂度为迭代次数相乘

       起泡排序

       封底估算

        抓住问题主要方面,简洁的得出问题的总体规律

        1天大概为10^5秒

        1生大概为3*10^9秒

        三生三世大概为10^10秒

        宇宙年龄大概为10^21秒 

        普通pc机速度为10^9 flops每秒,天河1A每秒10^15 flops

        算法威力巨大

     迭代与递归

        迭代乃人工,递归方神通

        效率方面:迭代较高效,递归简洁但效率较低

        分而治之:凡治众如治寡,分数是也。

        减而治之:逐步缩减问题规模

           递归跟踪分析:检查每个递归实例,累计时间,总和即算法执行时间

        递推方程:  T(n) = T(n - 1) + O(1)

        分而治之:将一个大规模问题分解为两规模相当的子问题,由子问题的解得到原问题的解

    动态规划

        make it right,work,fast       

         颠倒计算方向:由自顶而下递归,变为自底而上迭代

         斐波那契数列计算(python)    

    #高效率迭代算法
    def fib(n):
        a,b = 0,1
        for x in range(0,n):
            print(b)
            a,b = b,a+b

        最长公共子序列

  • 相关阅读:
    Python之迭代器,生成器
    Python函数--装饰器进阶
    Python之函数的本质、闭包、装饰器
    Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链
    Python函数的定义与调用、返回值、参数
    Python之文件操作
    Python之集合
    基本数据类型补充,深浅copy
    Python基础-元组、列表、字典
    Python常用模块(一)
  • 原文地址:https://www.cnblogs.com/roygood/p/9839719.html
Copyright © 2011-2022 走看看