人工智能3.1 -- python算法篇(一)引言和常识

python,大数据,机器学习,深度学习,计算机视觉

三、python算法篇(一)引言和常识

引例
如果a+b+c = 1000, 且a^2 + b^2 = c^2(a,b,c为自然数),求a、b、c所有可能的集合。

思路:枚举法

import time

start_time = 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("times:%d" % (end_time - start_time))
print("finished")

时间复杂度怎么来的

一段程序代码的好坏,算法是否高效,怎么判断?
猜想:利用程序执行间反应算法效率。但这个真的准确吗?
试想,假设有一高效代码和一低效代码,但我们这段高效代码的执行的硬件环境是一古董级别的电脑(卡的不要不要的)

每台机器执行的总时间不同,但是执行基本运算数量相同。执行的基本数量总和就叫时间复杂度。

在这里插入图片描述

时间复杂度:
广义上理解:花费的时间
狭义上理解:运算的步骤数量
时间复杂度全称叫渐进时间复杂度
T(n) = k g(n) + b
= O(g(n))
上面g(n)被称为T(n)的渐进函数,把T(n)相关系数全忽略掉,实际中不关心这系数,留下g(n)即可!
注:这里n是什么呢?
上面上面例子中,a+b+c = 1000,若a+b+c = 2000, a+b+c = 3000…,也就是a+b+c = n这一类问题,其时间负责度可以用T(n)表示,n表示程度,规模,不管是几都是相同类型问题都可以用T(n) = O(…)表示。
在这里插入图片描述
在这里插入图片描述
下图结论非常重要
在这里插入图片描述
记忆方法:

由图看出 O(1) < O(logn) < O(n),
下面为了直观简单表示,不写O(),(实际中不可以这么写)
即:当n趋于正无穷大时,有下面成立:
1 < logn < n   , n->正无穷大 (如图,不证明)
n < nlogn< n^2  , n->正无穷大 (上式两边同时乘以n)
n^2 < n^3  , n->正无穷大
n^3 < 2^n , n->正无穷大  (注:3个n相乘,比不上大量的2相乘厉害,如n = 100, 100*100*100 < 2 ^100,指数幂增长最厉害,如围棋落子共有 3 ^361种情况,这超过宇宙原子数)
2^n < n! , n->正无穷大
	证明:n!除去一个2,  2^n也除去一个2,再比较看看,也就是
			   n! = n*(n-1)*(n-2)...4*3*2*1 = [n*(n-1)*(n-2)...4*3*1]*2
	         2^n = [2^(n-1)]*2
	         显然n*(n-1)*(n-2)...4*3*1 > 2^(n-1) , n趋于无穷大
	         举例,n=100,2^100与100!比较
	         100! = 100*99*98...4*3*2*1=(100*99*98...4*3*1)*2,括号里为99项
	         2^100 = (2*2*2...2)*2, 括号里为99个2
	        99个2相乘显示是小于 (100*99*98...4*3*1)的
	        所以2^100 < 100! 
n! < n^n , n->正无穷大    (注:显然n*(n-1)...3*2*1 < n*n...n*n*n)
综上:
1 < logn < n < nlogn < n^2 < n ^3 < 2 ^n < n! < n ^n   , 当n趋于正无穷大时
所以 O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n ^3) < O(2 ^n) < O(n!) < O(n ^n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值