• 数据结构&算法(二)_算法基础之前传(递归、时间复杂度、空间复杂度、二分查找)


    什么是算法:

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

     递归的两个特点:

    •   调用自身
    •   结束条件

    递归示例:

    def func(x):
        if x==0:
            print("我的小鲤鱼",end='')
        else:
            print("抱着",end='')
            func(x-1)
            print("的我",end="")
            
    func(5)
    递归示例一:我的小鲤鱼
    '''
    1 1 2 3 5 8 13 21 34 
    输出长度为 n 的斐波那契数列
    '''
    #方式一:while 循环
    def fibo(num):
        a=1
        b=1
        i=1
        while i<=num:
            print(a,end=" ")
            a,b = b,a+b
            i+=1
    # fibo(10)
    
    #方式二:用递归函数方式
    #输出某一项
    def fibo2(num):
        if num == 1 or num==2:
            return 1
        elif num>2:
            return fibo2(num-1)+fibo2(num-2)
    #s输出整个数列
    # for i in range(1,11):
    #     print(fibo2(i),end=" ")
    
    #方式三
    def fibo3(a,b,num):
        if a > num:
            return
        print(a,end=" ")
        fibo3(b,a+b,num)
    fibo3(1,1,1100)
    递归示例二:斐波那契数列

    时间复杂度

     空间复杂度

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

    利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。  
    (1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
    (2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
    一个算法所需的存储空间用f(n)表示。S(n)=O(f(n))  其中n为问题的规模,S(n)表示空间复杂度。
     

    二分查找

    思路:

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

     特点:
    二分查找适合有序列表
    时间复杂度 O(logn)
     
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    '''
    二分查找适合有序列表
    时间复杂度 O(logn)
    '''
    def bin_search(li,val):
        low = 0
        high = len(li) -1
        while li[low] <= li[high]:
            mid = (low+high)//2
            if li[mid] == val:
                print("search success! the index is:{0}".format(mid))
                return None
            elif li[mid] < val :
                low = mid+1
            else:
                high = mid -1
        else:
            print("val is not exist")
            return None
    
    # 二分查找递归版:
    def bin_search_rec(li,val,low,high):
        mid = (low+high)//2
        while li[low] <= li[high]:
            if li[mid] == val:
                print("search success! the index is:{0}".format(mid))
                return None
            elif li[mid] < val:
                return bin_search_rec(li, val, mid+1, high)
            else:
                return bin_search_rec(li, val, low, mid-1)
        else:
            print("val is not exist")
            return None
    li = [1,3,6,8,9,11,14,16,22,31,44,56,58]
    bin_search_rec(li,23,0,12)
    

      

     
     
     
     
     
     
     
  • 相关阅读:
    java设计模式9.备忘录模式、访问者模式、调停者模式
    java设计模式8.迭代子模式、责任链模式、命令模式
    java设计模式7.策略模式、模板方法模式、观察者模式
    java设计模式5.组合模式、门面模式、享元模式、桥接模式
    java设计模式4.适配器模式、装饰器模式
    第6章 事务管理 6.1 spring事务
    第8章 浏览器对象模型BOM 8.1 window对象
    关于Socket、TCP/IP、HTTP、FTP及网络编程
    GO.Web服务
    git clone 下载慢
  • 原文地址:https://www.cnblogs.com/hedeyong/p/7846146.html
Copyright © 2020-2023  润新知