python自动开发之(算法)第二十七天

时间:2022-10-27 16:32:21

1、什么是算法?

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

2、复习:递归

递归的两个特点:(1) 调用自身 (2)结束条件

def func1(x):
print(x)
func1(x-1) def func2(x):
if x>0:
print(x)
func2(x+1) def func3(x):
if x>0:
print(x)
func3(x-1) def func4(x):
if x>0:
func4(x-1)
print(x)

func1和func2不是递归

func3和func4是递归,但是结果不一样,func3(5)打印的是5,4,3,2,1 而func4(5)结果是1,2,3,4,5

3、时间复杂度

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

python自动开发之(算法)第二十七天

python自动开发之(算法)第二十七天

小结:

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

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

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

  O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(nlogn)<O(n^3)

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

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

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

  循环减半的过程O(logn)

  几次循环就是n的几次方的复杂度

4、空间复杂度

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

5、列表查找

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

  输入:列表、待查找元素

  输出:元素下标或未查找到元素

6、顺序查找

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

7、二分查找

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

def bin_search(data_set,val):
'''
mid:下标
low:每次循环的列表最左边下标
high:每次循环的列表最右边下标
:param data_set:列表
:param val: 要找的值
:return:
'''
low = 0
high = len(data_set)-1
while low <= high:
mid = (low+high)//2
if data_set[mid] == val:
return mid
elif data_set[mid] > val:
high = mid - 1
else:
low = mid + 1
return

8、列表排序

  将无序列表变为有序列表

  应用场景: 各种榜单 各种表格 给二分查找用 给其他算法用

  输入:无序列表

  输出:有序列表

9、排序中比较慢的三种: 冒泡排序 选择排序 插入排序

   快速排序

   排序NB二人组: 堆排序 归并排序

没什么人用的排序: 基数排序 希尔排序 桶排序

  算法关键点: 有序区 无序区

10、冒泡排序

  首先,列表每两个相邻的数,如果前边的比后边的大,那么交换这两个数

  n = len(list),循环了i趟(i=n-1),第i趟循环比较了(j = n-i-1 )次,j是每趟循环比较的次数 

import random,time

#装饰器
def cal_time(func):
def wrapper(*args,**kwargs):
t1 = time.time()
ret = func(*args,**kwargs)
t2 = time.time()
print('time cost: %s \r\nfunc from %s'%(t2-t1,func.__name__))
return func
return wrapper @cal_time
def bubble_sort(li):
for i in range(len(li) - 1):
for j in range(len(li) - i - 1):
#升续
if li[j] > li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
#降续
# if li[j] < li[j+1]:
# li[j],li[j+1]=li[j+1],li[j] data = list(range(1000))
random.shuffle(data)
print(data)
bubble_sort(data)
print(data)

  优化后的冒泡排序:

    如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以直接结束算法。

import random,time

#装饰器
def cal_time(func):
def wrapper(*args,**kwargs):
t1 = time.time()
ret = func(*args,**kwargs)
t2 = time.time()
print('time cost: %s \r\nfunc from %s'%(t2-t1,func.__name__))
return func
return wrapper @cal_time
def bubble_sort(li):
for i in range(len(li) - 1):
exchange = False
for j in range(len(li) - i - 1):
#升续
if li[j] > li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
exchange = True
#降续
# if li[j] < li[j+1]:
# li[j],li[j+1]=li[j+1],li[j]
# exchange = True
#这里是指上一趟,值之间没有发生交换,就退出循环
if not exchange:
break data = list(range(1000))
random.shuffle(data)
print(data)
bubble_sort(data)
print(data)

11、选择排序

  一趟遍历记录最小的数,放到第一个位置; 再一趟遍历记录剩余列表中最小的数,继续放置;

import random,time

#装饰器
def cal_time(func):
def wrapper(*args,**kwargs):
t1 = time.time()
ret = func(*args,**kwargs)
t2 = time.time()
print('time cost: %s --> \nfunc from %s'%(t2-t1,func.__name__))
return func
return wrapper @cal_time
def select_sort(li):
for i in range(len(li)-1):
min_loc = i
for j in range(i+1,len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[i],li[min_loc] = li[min_loc],li[i]

12、插入排序

def insert_sort(li):
for i in range(1,len(li)):
tmp = li[i]
j = i - 1
while j >= 0 and tmp < li[j]:
li[j + 1] = li[j]
j -= 1
li[j + 1] = tmp

13、练习 用冒泡法把打乱的带ID的信息表排序

import random

def random_list(n):
ids = range(1000,1000+n)
result = []
a1 = ["王","陈","李","赵","钱","孙","武"]
a2 = ["丹","泽","","","晶","杰","金"]
a3 = ["强","华","国","富","宇","齐","星"]
for i in range(n):
age = random.randint(16,38)
id = ids[i]
name = '%s%s%s'%(random.choice(a1),random.choice(a2),random.choice(a3))
dic = {}
dic['id'] = id
dic['姓名'] = name
dic['年龄'] = age
result.append(dic)
return result def bubble_sort(li):
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j]['id'] > li[j+1]['id']:
li[j],li[j+1] = li[j+1],li[j] data1 = random_list(100)
random.shuffle(data1)
print(data1)
bubble_sort(data1)
print(data1)

14、快速排序:快

  好写的排序算法里最快的

  快的排序算法里最好写的  

快排思路:

    取一个元素p(第一个元素),使元素p归位;

    列表被p分成两部分,左边都比p小,右边都比p大;

    递归完成排序。

python自动开发之(算法)第二十七天

#快排的复杂度是O(nlog(n)),这是一个特殊情况 
#口诀 右手左手一个慢动作,右手左手慢动作重播(递归)
import time,random,copy

def cal_time(func):
def wrapper(*args,**kwargs):
t1 = time.time()
ret = func(*args,**kwargs)
t2 = time.time()
print('time cost: %s from %s'%(t2-t1,func.__name__))
return func
return wrapper def quick_sort_x(data,left,right):
#这里的left和right是定义列表data,最少有两个元素
if left<right:
#partition分割函数,mid是放好的元素的下标
mid = partition(data,left,right)
#以下类似二分
quick_sort_x(data,left,mid-1)
quick_sort_x(data,mid+1,right) #快排的复杂度是O(nlog(n)),这是一个特殊情况
def partition(data,left,right):
#获取左边的第一个元素,这里写left不能写零,因为后面需要递归
tmp = data[left]
#终止条件为当left和right碰上时,所以左小于右时为while循环的条件(left和right是下标)
while left < right:
#循环条件是右边比tmp大,直到找到右边比tmp小的数,停止循环
while left < right and data[right] >= tmp:
right -= 1
#把找到的右边比tmp小的数移到左边空出来的位置
data[left] = data[right]
#循环条件是左边比tmp小,继续循环,直到找到左边比tmp大的数,结束循环
while left < right and data[left] <= tmp:
left += 1
#把左边找到的大于tmp的数移到右边空出来的位置
data[right] = data[left]
#当左右相等时,就把tmp放到left和right碰到的位置
data[left] = tmp
#mid的值和lef或right值相同,return哪个都可以
#mid = left
# return mid
return left #对递归函数的装饰,需要再封装一层
@cal_time
def quik_sort(data):
#0及是left,len(data)-1为right
return quick_sort_x(data,0,len(data)-1)
import time,random,copy

def cal_time(func):
def wrapper(*args,**kwargs):
t1 = time.time()
ret = func(*args,**kwargs)
t2 = time.time()
print('time cost: %s from %s'%(t2-t1,func.__name__))
return func
return wrapper def quick_sort_x(data,left,right):
#这里的left和right是定义列表data,最少有两个元素
if left<right:
#partition分割函数,mid是放好的元素的下标
mid = partition(data,left,right)
#以下类似二分
quick_sort_x(data,left,mid-1)
quick_sort_x(data,mid+1,right) #快排的复杂度是O(nlog(n)),这是一个特殊情况
def partition(data,left,right):
#获取左边的第一个元素,这里写left不能写零,因为后面需要递归
tmp = data[left]
#终止条件为当left和right碰上时,所以左小于右时为while循环的条件(left和right是下标)
while left < right:
#循环条件是右边比tmp大,直到找到右边比tmp小的数,停止循环
while left < right and data[right] >= tmp:
right -= 1
#把找到的右边比tmp小的数移到左边空出来的位置
data[left] = data[right]
#循环条件是左边比tmp小,继续循环,直到找到左边比tmp大的数,结束循环
while left < right and data[left] <= tmp:
left += 1
#把左边找到的大于tmp的数移到右边空出来的位置
data[right] = data[left]
#当左右相等时,就把tmp放到left和right碰到的位置
data[left] = tmp
#mid的值和lef或right值相同,return哪个都可以
#mid = left
# return mid
return left #对递归函数的装饰,需要再封装一层
@cal_time
def quik_sort(data):
#0及是left,len(data)-1为right
return quick_sort_x(data,0,len(data)-1) #冒泡排序
@cal_time
def bubble_sort(li):
for i in range(len(li) - 1):
exchange = False
for j in range(len(li) - i - 1):
#升续
if li[j] > li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
exchange = True
#降续
# if li[j] < li[j+1]:
# li[j],li[j+1]=li[j+1],li[j]
# exchange = True
#这里是指上一趟,值之间没有发生交换,就退出循环
if not exchange:
break data = list(range(5000))
random.shuffle(data)
#深度拷贝
data1 = copy.deepcopy(data)
data2 = copy.deepcopy(data) #快排和冒泡的比较
quik_sort(data1)
bubble_sort(data2)
print(data1)

升续:

python自动开发之(算法)第二十七天

降续:

python自动开发之(算法)第二十七天

排序速度的定义:

python自动开发之(算法)第二十七天

一般情况下快排比冒泡快,快排有递归深度的问题,如果深度高的话,需要调整。

15、堆排序

(1)树与二叉树简介

  树是一种数据结构 比如:目录结构

  树是一种可以递归定义的数据结构

  树是由n个节点组成的集合:

    如果n=0,那这是一棵空树;

    如果n>0,那存在1个节点作为树的根节点,其他节点可以分为m个集合,每个集合本身又是一棵树。

  一些概念

    根节点、叶子节点

    树的深度(高度)

    树的度

    孩子节点/父节点 子树

  python自动开发之(算法)第二十七天

(2)二叉树

  二叉树:度不超过2的树(节点最多有两个叉)

  python自动开发之(算法)第二十七天

(3)满二叉树,完全二叉树

python自动开发之(算法)第二十七天

(4)二叉树的存储方式

  链式存储方式

  顺序存储方式(列表)

  

  父节点和左孩子节点的编号下标有什么关系?

  0-1 1-3 2-5 3-7 4-9

  i ~ 2i+1

  父节点和右孩子节点的编号下标有什么关系?

  0-2 1-4 2-6 3-8 4-10

  i ~ 2i+2

(5)小结

  二叉树是度不超过2的树

  满二叉树与完全二叉树

  (完全)二叉树可以用列表来存储,通过规律可以从父亲找到孩子或从孩子找到父亲

(6)堆排序

  大根堆:一棵完全二叉树,满足任一节点都比其孩子节点大

  小根堆:一棵完全二叉树,满足任一节点都比其孩子节点小

python自动开发之(算法)第二十七天

(7)堆排序过程

  a、建立堆

  b、得到堆顶元素,为最大元素

  c、去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。

  d、堆顶元素为第二大元素。

  e、 重复步骤3,直到堆变空。

  

python自动开发之(算法)第二十七天的更多相关文章

  1. python自动开发之第二十二天

    知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 一. Session 基于Cookie做用户验证时:敏感信息不 ...

  2. python自动开发之第二十五天

    一.组合搜索 参考: http://www.cnblogs.com/ccorz/p/5985205.html 二.JSONP 1.在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但 ...

  3. python自动开发之第二十四天(Django)

    一.ModelForm操作及验证 1.class Meta:class Meta: #注意以下字段不能加逗号 model = models.UserInfo #这里的all代指所用的字段,也可以是一个 ...

  4. python自动开发之第二十三天(Django)

    一.一大波model操作 1. 创建数据库表 # 单表 # app01_user ==> tb1 # users class User(models.Model): name = models. ...

  5. python自动开发之第十三天

    1.Paramiko模块下的demo.py程序     前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连 ...

  6. python自动开发之第二十一天

    一.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? 1.Form表单提交: 提交 -> url > 函数或类中的方法 - .... HttpResp ...

  7. python自动开发之第十八天

    一.JS正则 test - 判断字符串是否符合规定的正则 rep = /\d+/; rep.test("asdfoiklfasdf89asdfasdf") # true rep = ...

  8. python自动开发之第十二天

    一.数据库的介绍 (1)由多张表组成(2)存取有规则,数据有关联(3)数据量大,被优化 好处:更有效的存取数据 二.关系型数据库管理系统(RDBMS) Oracle,Mysql,Sqlserver,D ...

  9. centos samba&sol;squid 配置 samba配置 smbclient mount fstab自动挂载samba curl -xlocalhost&colon;3128 www&period;qq&period;com squid配置 3128 DNSPOD 第二十七节课

    centos  samba/squid 配置  samba配置 smbclient  mount fstab自动挂载samba curl -xlocalhost:3128 www.qq.com squ ...

随机推荐

  1. 关于ubuntu16无线网卡RTL8723BE频繁掉线及信号不足的解决办法

    最近在新电脑上装了ubuntu16,结果wifi经常连不上,连上了过段时间就掉线,路由器就在电脑的旁边,而且信号非常的若. 但是windows系统没有任何问题,所以就在网上找解决办法,也按照网上的方法 ...

  2. leetcode 179&period; Largest Number 求最大组合数 ---------- java

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

  3. Tomcat 6 --- 使用Jasper引擎解析JSP

    熟悉JAVA web开发的朋友都知道JSP会被转换成java文件(预编译),然后编译成class使用,即按照JSP-->java-->class的过程进行编译. 由于JVM只认识class ...

  4. Unity 状态转化机器

    using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /** 有限状 ...

  5. CVE&colon; 2014-6271、CVE&colon; 2014-7169 PATCH方案分析

    目录 . RedHat官方给的PATCH第一套方案 . RedHat官方给的PATCH临时方案 . RedHat官方给的PATCH第二套方案 1. RedHat官方给的PATCH第一套方案 0x1: ...

  6. OpenGL的几何变换2之内观察立方体

    我想实现的一个场景是:一个立方体,相机的坐标在立方体的中心点,相机不变,立方体旋转,可以站在立方体中心点查看立方体内部. 实际上就是立方体图像,这是在全景图片当作比较简单的方式,画面不会变形和扭曲,但 ...

  7. Linux之Samba的配置

    Samba的配置   对于linux与windows共享,和平共处,我们可以用Samba软件 Samba是一套免费的开源软件,可以在linux或其他类unix操作系统上实现windows域控制器,文件 ...

  8. jQuery响应式幻灯片插件jquery&period;glide&period;js(支持触摸&amp&semi;轻量级)

    找到一款好的幻灯片插件不容易,找到一款功能全并且使用很简单的幻灯片更不容易,今天为大家分享一款全能的幻灯片插件glide.js,也是我现在在使用的一款插件. jquery.glide.js是响应和触摸 ...

  9. Java面试大纲-java面试该做哪些准备,java开发达到这样的水平可以涨工资

    Java培训结束,面临的就是毕业找工作.在找工作时,就要针对性地做充分的面试准备.准备不充分的面试,完全是浪费时间,更是对自己的不负责. 上海尚学堂Java培训整理出Java面试大纲,其中大部分都是面 ...

  10. Atcoder Grand Contest 032

    打的第一场Atcoder,已经知道会被虐得很惨,但没有想到竟然只做出一题-- 思维急需提升. A - Limited Insertion 这题还是很签到的. 感觉正着做不好做,我们反着来,把加数变为删 ...