机器执行基本运算数量总和。描述算法的时间效率。
假定计算机执行算法的每一个基本操作的时间是一个固定的时间单位,那么有多少个基本操作就代表会花多少时间单位。虽然对于不同机器环境而言确切的时间单位不同,但是对于算法进行多少个基本操作在规模数量级上却是相同的。
示例:
则上图时间复杂度为:T(n) = n^3 *2
在分析中,只看大概特征就够了,所以: T(n) = n^3
对于算法的时间效率,用“大O记法”表示
对于单调的整数函数f,如果存在一个整数函数g和实常数c>0,使得对于充分大的n总有f(n)<=c*g(n),就说函数g是f的一个渐进函数(忽略常数),记为f(n)=O(g(n))。
也就是说,在趋向无穷的极限意义下,函数f的增长速度受到函数g的约束,即函数f与函数g的特征相似。
假设存在函数g,使得算法A处理规模为n的问题所用时间为 T(n)=O(g(n)),则O(g(n))为算法A的渐进时间复杂度。
最坏时间复杂度
同一个算法,处理的数据不同,时间复杂度可能不同,我们主要选择最坏的,用时最多的那一个作为衡量这个算法的时间复杂度。
def test1():
l = []
for i in range(1000):
l = l + [i]
def test2():
l = []
for i in range(1000):
l.append(i)
def test3():
l = [i for i in range(1000)]
def test4():
l = list(range(1000))
from timeit import Timer
t1 = Timer("test1()", "from __main__ import test1")
print("concat ",t1.timeit(number=1000), "seconds")
t2 = Timer("test2()", "from __main__ import test2")
print("append ",t2.timeit(number=1000), "seconds")
t3 = Timer("test3()", "from __main__ import test3")
print("comprehension ",t3.timeit(number=1000), "seconds")
t4 = Timer("test4()", "from __main__ import test4")
print("list range ",t4.timeit(number=1000), "seconds")
list和dict不是基本类型,内部操作就会有不同的时间复杂度。
我们如何用Python中的类型来保存一个班的学生信息? 如果想要快速的通过学生姓名获取其信息呢?
列表和字典都可以存储一个班的学生信息,但是想要在列表中获取一名同学的信息时,就要遍历这个列表,其时间复杂度为O(n),而使用字典存储时,可将学生姓名作为字典的键,学生信息作为值,进而查询时不需要遍历便可快速获取到学生信息,其时间复杂度为O(1)。
数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型。如:int,float,char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构。数据结构指数据对象中数据元素之间的关系。
Python的内置数据结构,比如列表、元组、字典。而有些数据组织方式,Python系统里面没有直接定义,这些数据组织方式称之为Python的扩展数据结构,比如栈,队列等。
抽象数据类型(Abstract Data Type)
抽象数据类型(ADT):把数据类型和数据类型上的运算捆在一起,进行封装。