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

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、时间复杂度

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

小结:

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

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

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

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

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

  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)

  

时间: 2024-10-10 18:05:22

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

python全栈开发基础【第二十七篇】IO模型

相关名词解析 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义, 其实绝大多数函数都是同步调用.但是一般而言,我们在说同步.异步的时候, 特指那些需要其他部件协作或者需要一定时间完成的任务. #举例: #1. multiprocessing.Pool下的apply #发起同步调用后,就在原地等着任务结束, 根本不考虑任务是在计算还是在io阻塞,总之就是一

python自动开发之第十九天

一.路由系统,URL 1.函数及类 函数:url(r'^index/', views.index), 类:url(r'^home/', views.Home.as_view()), 2.顺序 url(r'^detail-(\d+)-(\d+).html', views.detail), 3.字典 url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail) PS: def detail(request, *args,**k

python自动开发之第二十一天

一.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? 1.Form表单提交: 提交 -> url > 函数或类中的方法 - .... HttpResponse('....') render(request,'index.html') redirect('/index/') 用户 < < 返回字符串 (当接收到redirect时)自动发起另外一个请求 --> url ..... 2.Ajax提交: $.ajax({ url: '/index

Python3快速入门(十七)——Python扩展模块开发

Python3快速入门(十七)--Python扩展模块开发 一.Python扩展模块 1.Python扩展模块简介 Python与C/C++交互的方案有多种,如Python C API,SWIG,SIP,ctypes,cpython,cffi,boost.python等.Python只是一个语言规范,有很多具体实现,CPython是标准Python,由C编写,Python脚本被编译成CPython字节码,然后由虚拟机解释执行,垃圾回收使用引用计数,Python与C/C++混合编程本质是基于CPy

python web 开发学习路线

自己目前学习python web 开发, 经过两个月的摸索,目前对web开发有了浅显的认识,把自己的学习过程贴出来.1.python入门推荐老齐<从零开始学python>,<python简明教程>,这两本书很适合小白入门(像我一样长期徘徊在编程门外的人)2.python进阶推荐<python学习手册>,python学习手册的前半部分与在入门教程中的基础部分相重复,后面部分对python的介绍更细致,比如面向对象的这部分对于小白理解相对容易.还有一本<python

javaSE第二十七天

第二十七天????447 1:反射(理解)????447 (1)类的加载及类加载器????447 (2)反射:????448 A:定义????448 B:获取字节码对象的三种方式????449 (3)反射的使用????450 A:通过反射获取构造方法并使用????450 1).反射获取构造方法的介绍????450 2)通过反射去获取该构造方法并使用????451 3)通过反射获取私有构造方法并使用????452 B:通过反射获取成员变量并使用????452 C:通过反射获取成员方法并使用????

用virtualenv建立多个Python独立开发环境

不同的人喜欢用不同的方式建立各自的开发环境,但在几乎所有的编程社区,总有一个(或一个以上)开发环境让人更容易接受. 使用不同的开发环境虽然没有什么错误,但有些环境设置更容易进行便利的测试,并做一些重复/模板化的任务,使得在每天的日常工作简单并易于维护. 什么是virtualenv? 在Python的开发环境的最常用的方法是使用 virtualenv 包. Virtualenv是一个用来创建独立的Python环境的包.现在,出现了这样的问题:为什么我们需要一个独立的Python环境? 要回答这个问

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

第二十七天 春之细雨润物于无形 —Spring的依赖注入

6月11日,晴."夏条绿已密,朱萼缀明鲜.炎炎日正午,灼灼火俱燃." IT人习惯把具体的事物加工成的形状一致的类,正是这样的一致,加上合适的规范,才能彰显对象筋道的牙感和bean清香的味道.Spring比谁都清楚OO的奥妙,让组件之间的依赖关系由容器在运行时期决定,称作依赖注入(Dependency Injection). 下面用一通俗的例子,一探依赖注入奥妙. 设计模式中的一个原则:针对接口编程,不要针对实现编程. 一.设计两个接口: (1)奶制品接口-MilkProductInte