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

Posted hedeyong11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构&算法_算法基础之前传(递归时间复杂度空间复杂度二分查找)相关的知识,希望对你有一定的参考价值。

什么是算法:

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

  

 
 
 
 
 
 
 

 

以上是关于数据结构&算法_算法基础之前传(递归时间复杂度空间复杂度二分查找)的主要内容,如果未能解决你的问题,请参考以下文章

python小白-day4递归和算法基础

数据结构&算法篇--二叉树的构建与遍历2-非递归遍历

数据结构&算法篇--二叉树的构建与遍历2-非递归遍历

Java版算法思想递归&分治&回溯&枚举&基础数论

Java版算法思想递归&分治&回溯&枚举&基础数论

求 算法:C语言实现 的PDF