什么是计算机科学?python
首先明确的一点就是计算机科学不单单是对计算机的研究,虽然计算机在科学发展的过程当中发挥了重大的做用,可是它只是一个工具,一个没有灵魂的工具而已。所谓的计算机科学其实是对问题、解决问题以及解决问题的过程当中产生产生的解决方案的研究。例如给定一个问题,计算机科学家的目标是开发一个算法来处理该问题,最终获得该问题的解、或者最优解。因此说计算机科学也能够被认为是对算法的研究。所以咱们也能够感觉到,所谓的算法就是对问题进行处理且求解的一种实现思路或者思想。程序员
如何形象化的理解算法?算法
一个常胜将军在做战以前都会进行战略的制定,目的是为了可以在最短的时间切成本消耗最低的状况下获取最终的胜利。若是将编码做为战场,则程序员就是这场战役的指挥官,你如何能够将你的程序能够在最短且消耗资源最小的状况下获取最终的执行结果呢?算法就是咱们的策略!编程
意义数据结构
数据结构和算法思想的通用性异常的强大,在任何语言中都被使用,它们将会是咱们编码生涯中伴随咱们最长久利器(左膀右臂)。有必定经验的程序员最终拼的就是算法和数据结构。app
数据结构和算法思想也能够帮助咱们拓展和历练编码的思惟,可让咱们更好的融入到编程世界的角角落落。数据结构和算法
什么是算法分析?ide
刚接触编程的学生常常会将本身编写的程序和别人的程序作比对,获取在比对的过程当中会发现双方编写的程序很类似但又各不相同。那么就会出现一个有趣的现象:两组程序都是用来解决同一个问题的,可是两组程序看起来又各不相同,那么哪一组程序更好呢?函数
引例: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)
概念 :对于数据(基本类型的数据(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'} }
使用不一样的形式组织数据,在基于查询时的时间复杂度是不同的。所以认为算法是为了解决实际问题而设计的,数据结构是算法须要处理问题的载体。
该模块能够用来测试一段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