Python开发【二十八章】:算法

算法基础

1、什么是算法?

算法(Algorithm):一个计算过程,解决问题的方法

2、复习:递归

递归的两个特点:

  • 调用自身
  • 结束条件

两个重要递归函数的对比:

# 由大到小
def func3(x):
    if x > 0 :
        print(x)
        func3(x-1)

# func3(5)
# 5 4 3 2 1

# 由小到大
def func4(x):
    if x > 0 :
        func4(x-1)
        print(x)

func4(5)
# 1 2 3 4 5

  

3、时间复杂度

时间复杂度:用来评估算法运行效率的一个东西:

print(‘Hello World‘)            # 0(1)

for i in range(n):                  # O(n)
    print(‘Hello World‘)

for i in range(n):                   # O(n^2)
    for j in range(n):
        print(‘Hello World‘)

for i in range(n):                   # O(n^3)
    for j in range(n):
        for k in range(n):
            print(‘Hello World‘)

第一个打印了一次时间复杂度为O(1);第二个打印了n次,所以时间复杂度为O(n);第三四个依次为n2和n的3次方

那么看看下面代码中的时间复杂度为多少?

# 非O(3) 而是O(1)
print(‘Hello World‘)
print(‘Hello Python‘)
print(‘Hello Algorithm‘)

# 非O(n2+n) 而是O(n2)
for i in range(n):
    print(‘Hello World‘)
        for j in range(n):
            print(‘Hello World‘)

# 非O(1/2n2) 而是O(n2)
for i in range(n):
    for j in range(i):
        print(‘Hello World‘)

再看看下面代码: 

# 时间复杂度 O(log2n) 或 O(logn)
while n > 1:
    print(n)
    n = n // 2

# n=64输出:
# 64
# 32
# 16
# 8
# 4
# 2

小结:

时间复杂度是用来估计算法运行时间的一个式子(单位)。

一般来说,时间复杂度低的算法比复杂度低的算法快。

常见的时间复杂度(按用时排序)

  • O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)

不常见的时间复杂度(看看就好)

  • O(n!) O(2n) O(nn) …

如何一眼判断时间复杂度?

  • 循环减半的过程?O(logn)
  • 几次循环就是n的几次方的复杂度

4、空间复杂度

空间复杂度:用来评估算法内存占用大小的一个式子

列表查找

列表查找:从列表中查找指定元素

  • 输入:列表、待查找元素
  • 输出:元素下标或未查找到元素

1、顺序查找

从列表第一个元素开始,顺序进行搜索,直到找到为止

2、二分查找

从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半

时间: 2024-11-13 02:06:31

Python开发【二十八章】:算法的相关文章

DRILLNET 2.0------第二十八章 背景知识

第二十八章 背景知识 <略>?

Python开发【十二章】:ORM sqlalchemy

一.对象映射关系(ORM) orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言 优点: 隐藏了数据访问细节,"封闭"的通用数据库交互,ORM的核心.他使

python运维开发(二十)----models操作、中间件、缓存、信号、分页

内容目录 select Form标签数据库操作 models操作F/Q models多对多表操作 Django中间件 缓存 信号 分页 select Form标签补充 在上一节中我们可以知道Form标签有两个作用,一个做用户提交数据验证,一个是生成HTML标签 在生成HTML标签中可以生成select标签,select的选项数据我们可以在数据库中查询读取到. class UserType(models.Model): caption = models.CharField(max_length=1

python运维开发(二十五)---cmdb开发

内容目录: 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central Computing and Telecommunications Agency)在20世纪80年代末制订,现由英国商务部OGC(Office of Government Commerce)负

Python(二十五)

一 进程与线程的概念 1.1 进程 考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?另外,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.你是不是已经想到在程序A读取数据的过程中,让程序B去执行,当程序A读取完数据之后,让程序B暂停.聪明,这当然没问题,但这里有一个关键词:切换. 既然是切换,那么这就涉及到了状态的保存,状态的恢

笨办法学Python(二十九)

习题 29: 如果(if) 下面是你要写的作业,这段向你介绍了"if语句".把这段输入进去,让它能正确执行.然后我们看看你是否有所收获. 1 people = 20 2 cats = 30 3 dogs = 15 4 5 6 if people < cats: 7 print "Too many cats! The world is doomed!" 8 9 if people > cats: 10 print "Not many cats!

Python(二十二)

一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 1 class Foo(object): 2 pass 3 4 class Bar(Foo): 5 pass

python 学习二十五天(python内置模块之序列化模块)

今日主要内容 1.python内置模块-序列化模块 python中的序列化模块 json 所有的编程语言都通用的序列化格式....它支持的数据类型非常有限 数字 字符串 列表 字典 pickle 只能在python语言的程序之间传递数据用的..pickle支持python中所有的数据类型 shelve python3.* 之后才有的 2.摘要模块---hashlib 3.一道经典面试题 第一.python内置模块---序列化 ***所有的导入模块都需要把import放在文件首位 什么叫序列化 能

笨办法学Python(二十五)

习题 25: 更多更多的练习 我们将做一些关于函数和变量的练习,以确认你真正掌握了这些知识.这节练习对你来说可以说是一本道:写程序,逐行研究,弄懂它. 不过这节练习还是有些不同,你不需要运行它,取而代之,你需要将它导入到 python 里通过自己执行函数的方式运行. 首先以正常的方式 python ex25.py 运行,找出里边的错误,并把它们都改正过来.然后你需要接着下面的答案章节完成这节练习. 你应该看到的结果 这节练习我们将在你之前用来做算术的 python 编译器里,用交互的方式和你的.