python学习之算法与数据结构一

什么是数据结构和算法

	从广义上讲,数据结构就是一组数据的存储结构,算法就是操作数据的一种方法

例如图书馆储存书籍。为了方便查找,图书管理员会将图书分门别类的进行‘储藏’。按照一定的顺序进行编号,就是书籍这种数据的储存结构。
而我们按照不同的方法来查找书籍,比如一本一本从头开始,或者按照书籍首字母查找,根据书籍类容分类来查找等等这些查找的方式都是算法
数据结构和算法是相辅相成的,数据结构是为算法服务的,算法要作用在特定的数据结构之上,因此我们无法孤立的讲算法,也无法孤立的讲数据结构
比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来储存数据。但如果我们使用链表这种数据结构,二分查找算法就无法工作了,因为链表不支持随机访问。
数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。

算法引入

引入

如果a + b + c = 1000,且a^2 + b^2 = c^2(a,b,c为自然数),那么如何求出a,b,c的组合
代码实现

import time

start_time = time.time()
for a in range(1001):
		for b in range(1001):
			for c in range(1001):
				if a + b + c == 1000 and a**2 + b**2 == c**2:
					print('a, b, c: %d %d %d'%(a, b, c))
end_time = time.time()
print("time: %f"%(start_time - end_time)
print("end")

算法的概念

算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般情况,当算法处理问题时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址以后再调用。
算法是独立存在的一种解决问题的方法和思想。
对于算法而言,使用什么语言并不重要,重要的是思想。
算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等),我们现在用的是Python描述。

算法的五大特征

一、输入:算法具有0个或多个输入
二、输出:算法至少有1个或多个输出
三、有穷性:算法在有限的步骤后会自动结束而不会无限循环,并且每一个步骤都会在可接受时间内完成
四、确定性:算法中的每一步都有确定的含义,不会出现二义性
五、可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成

二次尝试

import time

start_time = time.time()
for a in range(1001):
	for b in range(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: %f"%(start_time - end_time))
print("end")

算法效率衡量

执行时间反应算法效率

对于同一个问题,上述两种算法在执行时间上有着巨大的悬殊,因此我们可以得出结论:实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。
但是仅仅看时间值绝对可信吗?
1、测试结果非常依赖外部环境
测试环境中硬件的不同会对测试结果有很大的影响。
2、测试结果受数据规模影响很大
对于同一个排序算法,待排序数据的有序度不一样,排序的时间就会有很大的差别。极端情况下,如果数据已经有序了,那么排序算法不需要任何操作,排序时间就会非常短。除此之外,如果测试数据规模太小,测试结果可能也无法真实的反应出算法的性能。

大O复杂度表示法

T(n) = O(f(n))
T(n)代表算法执行的时间,n代表数据规模的大小,f(n)代表每行代码执行的次数的总和,因为这是一个公式,所以用f(n)表示。O代表代码的执行时间T(n)与f(n)表达式成正比。

时间复杂度分析

1、只关注循环执行次数最多的一段代码
2、加法原则:总复杂度等于量级最大的那段代码的复杂度

最坏时间复杂度

算法完成工作最少需要多少基本操作,最优时间复杂度
算法完成工作最多需要多少基本操作,最坏时间复杂度
算法完成工作平均需要多少基本操作,平均时间复杂度

我们只关注最坏时间复杂度。

常见时间复杂度

Python的内置类型性能分析

代码执行时间测量模块

timeit模块

timeit可以用来测量一小段Python代码的执行速度

class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)
Timer是测量小段代码执行速度的类。
stmt参数是要测试的代码语句(statment);
setup参数是运行代码时需要的设置;
timer参数是一个定时器函数,与平台有关。

list操作实验

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))
def test5():
	li = []
		for i in range(1000):
			li.insert(0, i)
from timeit import Timer
t1 = Timer("test1()", "from __main__ import test1")
print("add", t1.timeit(number=1000))
t2 = Timer("test2()", "from __main__ import test2")
print("append ",t2.timeit(number=1000))
t3 = Timer("test3()", "from __main__ import test3")
print("list derivation",t3.timeit(number=1000))
t4 = Timer("test4()", "from __main__ import test4")
print("list range ",t4.timeit(number=1000))
t5 = Timer("test5()", "from __main__ import test5")
print("list insert ",t5.timeit(number=1000))

数据结构

数据结构指数据对象中数据元素之间的关系。
程序 = 数据结构 + 算法
算法时为了解决问题而设计的,数据结构是算法需要处理的问题载体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值