何为数据结构?
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
Python提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做Python的内置数据结构,比如列表、元组、字典。而有些数据组织方式,Python系统里面没有直接定义,需要我们自己去定义实现这些数据的组织方式,这些数据组织方式称之为Python的扩展数据结构,比如栈,队列等。
何为算法?
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用时间(空间)复杂度来衡量来衡量。(百度百科)
数据结构和算法有什么关系?
数据结构只是静态的描述了数据元素之间的关系。
高效的程序需要在数据结构的基础上设计和选择算法。
每一个程序的构成都可以看做是数据结构和算法的结合。
枚举
一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。(百度百科)
引入一道题
如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?
初次思考该题,我们一定会想到定义a,b,c三个变量,如果对a,b,c三个变量进行枚举,那么a,b,c所能表示的数值又都是多少呢?
不难想到a,b,c具有相同的取值范围(0-1000),我们已经明确了范围,接下来对于a,b,c的范围以及题中所给定的对应关系进行运算。
import time
start_time = time.time()
for a in range(0, 1001): #注意这里为什么是1001而不是1000
for b in range(0, 1001):
for c in range(0, 1001):
if a**2 + b**2 == c**2 and a+b+c == 1000:
print("a, b, c: %d, %d, %d" % (a, b, c))
end_time = time.time()
print("time is: %f" % (end_time - start_time))
print("over")
代码中我定义了开始时间和结束时间来计算具体的运行时间,经过长时间的等待终于运算完毕,从代码中我们不难发现我们嵌套了三个循环的程序,这也导致运算巨大,那么如何对代码进行改进?
从题的定义中我们不难发现,如果我们定义了a,b变量那么c变量则可以由1000-a-b得到,如此对代码进行修改。
import time
start_time = time.time()
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:%d, %d, %d" % (a, b, c))
end_time = time.time()
print("time is :%d" % (end_time-start_time))
print("over")
运行该代码后就会发现所用时间会大大的减少,这便是我们运用算法对该题进行优化后的结果。
使用软件pycharm
版本Python3.6.1