python 算法设计与分析_算法设计与分析——2.渐进分析与Python计算模型

2.1引言

求解问题的算法往往并不唯一,为了量化不同算法的效率,需要通过渐近分析方法来计算算法的时间复杂度。前一章的例子可知,通过巧妙得设计可以缩短寻找到局部高点得时间,算法的时间复杂度可以从O(n)提高到O(logn).

渐进分析简化算法时间复杂度的计算,在渐进分析下,并不需要精确计算算法的执行时间,而只需要计算时间函数在输入规模n增长时增长趋势。也就是说,算法执行的时间函数中,n的低次项和高次项前的常数项均可略去。n在变大时,n的高次项决定了函数的增长趋势。

2.2 计算模式

d31e630cae01

d31e630cae01

代码2.1

def compare_num(i,j):

k = 3

if i>j:

return i

else:

return k

2.3 算法的渐进分析

d31e630cae01

d31e630cae01

d31e630cae01

2.4 Python 计算模型

学习的算法设计和分析所有的算法描述均采用 Python

2.4.1 控制流语句

条件语句

d31e630cae01

代码2.2 条件语句的示例

def num_verify(num):

if num<0:

num = 0

print('非负数转换为 0!')

elif num == 0:

print('零)

elif num ==1:

print('等于1')

else:

print('大于1')

return num

d31e630cae01

循环语句

d31e630cae01

代码2.3 循环语句示例

def sum_nums(low,high):

if high

print("error")

return

sumnum = 0

for i in range(low,high+1)

sumnum += i

return sumnum

2.4.2 数据结构

d31e630cae01

d31e630cae01

d31e630cae01

x**2 for x in range(10)

d31e630cae01

代码 2.5 列表推导生成随机数组

import random

def generate_rand_array(num=10,maxnum=1000):

arrary = [random.randint(1,maxnum) for in in range(num)]

random.shuffle(array) # 随机打乱array 中的元素

random.shuffle(array)

return array

在序列中循环时,索引位置和对应值可以使用enumerate()函数同时得到:

for i,v in enumerate(['tic','tac','toe']):

d31e630cae01

d31e630cae01

d31e630cae01

2.5 算法分析实例

2.5.1 求最大值

d31e630cae01

2.5.2 二分搜索

代码 2.8 二分搜索

def binary_search(A,K):

first = 0

last = len(A)-1

found = False

while first <= last:

midpoint = (first + last)//2

if k== A[midpoint]:

found = True

else:

if k

last = midpoint-1

else:

first = midpoit+1

return found

d31e630cae01

2.5.3 子集求和问题

d31e630cae01

d31e630cae01

代码2.9 求子集和

def subset_sum(lst,target):

for i in range(2**len(lst)):

pick = list(mark(lst,bin(i)[2:]))

if sum(pick) == target:

return pick

def mark(lst,m): # 产生由m(二进制数)决定的 lit的子集

m = m.zfill(len(lst)) # 按照lst 的位数扩展m 和lst长度一致的数

return map(lambda x:x[0],filter(lambda x: x[1] != '0',zip(lst,m))) #通过zip 组成一个元组数据(lst中的数,m中的数),过滤掉每个元组数组中m为0的数,剩下的取lst中的数

d31e630cae01

d31e630cae01

d31e630cae01

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值