第一阶段-数据结构与算法-第一天(算法引言)

一、引入概念

1.1 、1.2、1.3 第一次尝试、算法提出、第二次尝试

算法概念及特性
算法是计算机处理信息的本质,是一种独立存在的解决问题的方法和思想。算法需要具备五大特性:
(1) 输入
(2) 输出
(3) 有穷性
(4) 确定性
(5) 可行性
问题
如果 a+b+c=1000,且 a2+b2=c2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?
第一次尝试
代码:

import time

start_time=time.time()

# 注意是三重循环
for a in range(0, 1001):
    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("elapsed: %f" % (end_time - start_time))
print('complete')

output:

C:\Anaconda3\envs\FS-GANS\python.exe C:/论文与项目/Gans/FS-GAN/FS-GAN-master/FS-GAN-master/coding/Firet_step.py
a, b, c: 0, 500, 500
a, b, c: 200, 375, 425
a, b, c: 375, 200, 425
a, b, c: 500, 0, 500
elapsed: 737.281484
complete

Process finished with exit code 0

第二次尝试
代码:

import time

start_time=time.time()

# 注意是二重循环
for a in range(0,1001):
    for b in range(0,1001):
        c = 1000-b-a
        if a**2+b**2==c**2:
            print("a, b, c: %d, %d, %d" %(a, b, c))
end_time=time.time()
print("elapsed: %f" % (end_time-start_time))
print("complete")

output:

C:\Anaconda3\envs\FS-GANS\python.exe C:/论文与项目/Gans/FS-GAN/FS-GAN-master/FS-GAN-master/coding/Firet_step.py
a, b, c: 0, 500, 500
a, b, c: 200, 375, 425
a, b, c: 375, 200, 425
a, b, c: 500, 0, 500
elapsed: 0.768869
complete

Process finished with exit code 0

1.4 、1.5、1.6 算法效率衡量、算法分析、常见时间复杂度

时间复杂度的几条基本计算规则
基本操作,即只有常数项,认为其时间复杂度为O(1)
顺序结构,时间复杂度按加法进行计算
循环结构,时间复杂度按乘法进行计算
分支结构,时间复杂度取最大值
判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略
在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。
第一次尝试的算法核心复杂度

for a in range(0, 1001):   # 循环结构
    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))

复杂度:T(n)=O(n*n*n*(1+1))=O(n3)
第二次尝试的算法核心复杂度

for a in range(0,1001): 	# 循环结构
    for b in range(0,1001):		# 循环结构
        c = 1000-b-a			# 顺序结构
        if a**2+b**2==c**2:		# 分支结构
            print("a, b, c: %d, %d, %d" %(a, b, c))

复杂度:T(n)=O(n*n*(1+1))=O(n2)
常见集中算法复杂度
在这里插入图片描述
在这里插入图片描述
练习:
O(5)=O(1)
O(2n + 1)=O(n)
O(n²+ n + 1)=O(n2)
O(3n³+1)=O(n3)

1.7 python内置类型性能分析

timeit模块中的Timer模块可以返回函数等代码运行的时间:
class timeit.Timer(stmt=‘pass’, setup=‘pass’, timer=<timer function>)
stmt表示要测试的函数运行代码,setup表示该函数从哪里加载的,一般自定义的函数或者变量在程序运行后都是从from _main_ import test1调用,其中test1是函数名。
问题:测试list生成的+、append、自动生成、list(range)四种方法的性能
代码

from timeit import Timer

def test1():
    list1=[]
    for i in range(1000):
        list1=list1 + [i]

def test2():
    list2=[]
    for i in range(1000):
        list2.append(i)

def test3():
    list3=[i for i in range(1000)]

def test4():
    list4=list(range(1000))

t1=Timer('test1()','from __main__ import test1')
print('+',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')

output

C:\Anaconda3\envs\FS-GANS\python.exe C:/论文与项目/Gans/FS-GAN/FS-GAN-master/FS-GAN-master/coding/Firet_step.py
+ 0.8676329 seconds
append 0.04790280000000002 seconds
comprehension 0.021035000000000026 seconds
list(range) 6.800000000084516e-06 seconds

Process finished with exit code 0

可以看到list(range)是性能最好的列表生成方式!!!
问题:列表pop第一个位置元素和pop最后一个位置元素的性能对比
代码

from timeit import Timer
x = list(range(2000000))
pop_zeros=Timer('x.pop(0)','from __main__ import x')
print('pop_zeros',pop_zeros.timeit(number=1000),'seconds')
x= list(range(2000000))
pop_ends=Timer('x.pop()','from __main__ import x')
print('pop_end',pop_ends.timeit(number=1000),'seconds')

output

C:\Anaconda3\envs\FS-GANS\python.exe C:/论文与项目/Gans/FS-GAN/FS-GAN-master/FS-GAN-master/coding/Firet_step.py
pop_zeros 4.9185597 seconds
pop_end 9.609999999948826e-05 seconds

Process finished with exit code 0

可以看到从最后一个元素开始pop速度更快,原因在后面的文章解释!

1.8 python内置类型性能分析

数据结构 数据储存的结构
(1) python中的字典等,已经是一种数据结构,而不再单纯的是一种数据类型。
(2) ADT(抽象数据类型):将数据本身和数据所能进行的操作封装在一起。如:学生类不仅包含学生数据还包含对学生数据的增、删、改、查操作。

总结

复杂度的衡量
timeit中Timer模块可以测试函数代码运行性能
list(range(1000))方法生成list耗时较少
pop最后一个元素比pop第一个元素程序运行速度快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值