Python 算法(一)

算法

算法是什么?为什么要用算法?

算法是解决问题的思路

题目:
a + b + c =1000  a^2 + b^2 = c^2 

策略一:

# a,b,c的取值范围为 0-1000
# 遍历 a b c ,
# 如果满足两个条件
# 打印出a,b,c

image-20200819230225370

但是这样的话,时间复杂度 O(n**3)

要等很久 才出结果

策略二:

# 由已知 c的值确定,将c的值替换 
# 遍历2次a ,b 当遍历b的时候,由于a,b已确定,可计算出c的值,
# 如果满足 a + b + c ==1000且 a^2 + b^2 = c^2 
# 打印出a, b, c

>>>for a in range(0, 1001):
       for b in range(0, 1001):
           c = 1000 - a - b
           if a ** 2 + b ** 2 == c ** 2:
               print(a, b, c)
            
0 500 500
200 375 425
375 200 425

很快就出来了

不同的算法,程序的优劣不一样.

image-20200819231336463

theSum = 0 执行算1次
for循环()并不算
里面的循环执行 n次
return执行一次
总共执行 n+2次

O(n)

计算 时间复杂度

image-20200819231632450

3n^2 + 2n + 4
# 放时间复杂度表达式中最有意译的一项: n^2
O(n^2)

思考:

  1. 问题: 时间复杂度是什么? 时间复杂度表达式是什么? 内面一项放哪一项?

  2. 算法作用于数据结构还是数据结构作用于算法? 算法和数据结构谁先出现的?

  3. python中list的append()方法为什么要那么实现?

  4. 数据结构是什么?

  5. 如果我想要查询某个学生的成绩,使用以下哪种数据结构较好? 分将阐述一下每种数据结构最坏情况的时间复杂度是多少?

    image-20200819233351712

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

  1. 四种插入列表的方式 怎么计算每种耗时呢?image-20200819234301109

答案:

  1. 衡量算法策略所耗时间的一种方法. O(n). 放表达式中最有意义的一项

  2. 算法作用于数据结构中. 数据结构是基于算法实现的. 先有算法,才有数据结构

  3. 因为这么实现可以使我的性能更优,所以是先有了算法才有数据结构.

    只不过在日常生活中,我们说,在不同的数据集中,使用不同的算法

  4. 对于数据(基本类型的数据(int, float, char) 的组织方式就被称为数据结构

  5. 第三种, 因为第三种的时间复杂度为 O(1), 第一种 O(n), 第二种O(n)

  6. # 1
    def test01():
        alist = []
        for i in range(1000):
            alist += [i]
    	reutrn alist
    
    # 2 
    def test02():
        alist = []
        for i in range(1000):
            alist.append(i)
        return alist
    
    # 3
    def test03():
        alist = [i for i in range(1000)]
        return alist
    # 4
    def test04():
        alist = list(range(1000))
        return alist
    

    可以使用python的 timeit库的Timer模块平均耗时来完成,

    image-20200819234949739

from timeit import Timer
time = Timer('test01()',)

if __name__ == '__mian__':
    # 两个参数 即将被执行的函数strmt 以及 函数执行需要的环境设置setup
    timer = Timer('test01()', 'from __main__ import test01')
    # 计算1000次的平均耗时
    timer.timeit(1000)
    

image-20200819235519105

posted on 2020-08-19 23:59  sunnywillow  阅读(95)  评论(0编辑  收藏  举报