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


    什么是算法:

      间而言之算法(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)
    

      

     
     
     
     
     
     
     
  • 相关阅读:
    开发者最好的推广平台
    [ERR] 2006
    PS通道
    PS图层样式
    PS 图层 蒙版
    科研狗的基本绘图技巧 | PS | AI
    memcached的常规操作:增删改查【转】
    mysql:pt-online-schema-change 在线修改表、删除表数据【转】
    HAProxy的四层与七层的区别及透传IP实战案例【转】
    【springBoot】SpringBoot修改启动logo图案
  • 原文地址:https://www.cnblogs.com/hedeyong/p/7846146.html
Copyright © 2020-2023  润新知