python数据分析与算法 之 一 基本概念

1.1算法

  • 什么是计算机科学?

    • 首先明确的一点就是计算机科学不仅仅是对计算机的研究,虽然计算机在科学发展的过程中发挥了重大的作用,但是它只是一个工具,一个没有灵魂的工具而已。所谓的计算机科学实际上是对问题、解决问题以及解决问题的过程中产生产生的解决方案的研究。例如给定一个问题,计算机科学家的目标是开发一个算法来处理该问题,最终得到该问题的解、或者最优解。所以说计算机科学也可以被认为是对算法的研究。因此我们也可以感受到,所谓的算法就是对问题进行处理且求解的一种实现思路或者思想。

  • 如何形象化的理解算法?

    • 一个常胜将军在作战之前都会进行战略的制定,目的是为了能够在最短的时间切成本消耗最低的情况下获取最终的胜利。如果将编码作为战场,则程序员就是这场战役的指挥官,你如何可以将你的程序可以在最短且消耗资源最小的情况下获取最终的执行结果呢?算法就是我们的策略!

  • 意义

    • 数据结构和算法思想的通用性异常的强大,在任何语言中都被使用,它们将会是我们编码生涯中伴随我们最长久利器(左膀右臂)。有一定经验的程序员最终拼的就是算法和数据结构。

    • 数据结构和算法思想也可以帮助我们拓展和历练编码的思维,可以让我们更好的融入到编程世界的角角落落。

  • 什么是算法分析?

    • 刚接触编程的学生经常会将自己编写的程序和别人的程序做比对,获取在比对的过程中会发现双方编写的程序很相似但又各不相同。那么就会出现一个有趣的现象:两组程序都是用来解决同一个问题的,但是两组程序看起来又各不相同,那么哪一组程序更好呢?

    引例:a+b+c = 1000 a^2 + b^2 = c^2 (a,b,c均为自然数),求出a,b,c可能的组合?

    #法一:
    for a in range(0,1001):
       for b in range(0,1001):
           for c in range(0,1001):
               if a+b+c == 1000 and a**2+b**2 == c**2:
                   print(a,b,c)
    #法二:
    for a in range(0,1001):
       for b in range(0,1001):
           c = 1000-a-b
           if a+b+c == 1000 and a**2+b**2 == c**2:
                   print(a,b,c)
  • 如何评判程序的优劣?

    • 消耗计算机资源和执行效果

    • 计算算法执行的平均耗时

    • 时间复杂度(推荐)

  • 时间复杂度

    • 评判规则 : 量化算法执行的操作/执行步骤的数量

    • 最重要的项 :时间复杂表达式中最有意义的项

    • 大 O 计法对时间复杂度进行表示 : O(量化表达式中最有意义的项)

    • 常见时间复杂度:

      • O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

    例一: 计算下列算法的时间复杂度

    def sumOfN(n):
       theSum = 0
       for i in range(1,n+1):
           theSum += i
       
       return theSum
    print(sumOfN(10))
    # 1+n+1 = n+2 ==> O(n)

    例二:计算下列算法的时间复杂度

    a=5
    b=6
    c=10
    for i in range(n):
      for j in range(n):
         x = i * i
         y = j * j
         z = i * j
    for k in range(n):
      w = a*k + 45
      v = b*b
    d = 33

    # 3 + n*n*3 + 2n + 1 ==> 3n**2+2n ==> 3n**2 ==> n**2 ==>O(n**2)

1.2 数据结构

  • 概念 :对于数据(基本类型的数据(int,float,char))的组织方式就被称作为数据结构。数据结构解决的就是一组数据如何进行保存,保存形式是怎样的。

     

    案例: 需要存储一些学生的学生信息(name,score),那么这些数据应该如何组织呢?查询某一个具体学生的时间复杂度是什么呢?(三种组织方式)

    #方式一:列表 + 字典
    [{
       'name':'xxx',
       'score':'xxx'
    },{
       'name':'xxx',
       'score':'xxx'
    },{
       'name':'xxx',
       'score':'xxx'
    }]

    #方式二: 列表 + 元组
    [
      ('name','score'),
      ('name','score'),
      ('name','score')
    ]

    #方式三: 字典 + 字典
    {
       'zhangsan':{'score':'xxx'},
       'lisi':{'score':'xxx'}
    }

    使用不同的形式组织数据,在基于查询时的时间复杂度是不一样的。因此认为算法是为了解决实际问题而设计的,数据结构是算法需要处理问题的载体。

1.3 python数据结构性能分析

timeit模块

  • 该模块可以用来测试一段python代码的执行时长/速度

  • Timer 类

    • 该类是 timerit 模块中专门用于测试代码的执行时长/速度的,原型 class

    • 用法 : timeit.Timer (stmt='pass',setup='pass')

      • stmt参数:表示即将进行测试的代码块语句。

      • setup:运行代码块语句时所需要的设置。

      • timeit函数:timeit.Timer.timeit(number=100000),该函数返回代码块语句执行number次的平均耗时。

  • 例:实例化一个空列表,然后将0-n范围的数据添加到列表中。(四种方式)

    from timeit import Timer
    def text01():
       alist = []
       for i in range(1000):
           alist.append(i)
       return alist

    def text02():
       alist = []
       for i in range(1000):
           alist += [i]
       return alist

    def text03():
       alist = [ i for i in range(1000)]
       return alist

    def text04():
       alist = list(range(1000))
       return alist

    if __name__ == '__main__':
       t1 = Timer('text01()',setup="from __main__ import text01")
       t_1 = t1.timeit(1000)
       print(t_1)
       
       t2 = Timer('text02()',setup="from __main__ import text02")
       t_2 = t2.timeit(1000)
       print(t_2)
       
       t3 = Timer('text03()',setup="from __main__ import text03")
       t_3 = t3.timeit(1000)
       print(t_3)
       
       t4 = Timer('text04()',setup="from __main__ import text04")
       t_4 = t4.timeit(1000)
       print(t_4)
       
    # 0.102241317647497
    # 0.09949069216443718
    # 0.0516077816489684
    # 0.019912033670678397

猜你喜欢

转载自www.cnblogs.com/lilinyuan5474/p/11498036.html