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

什么是算法:

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

  

时间: 2024-10-01 07:39:43

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

数据结构(二) — 算法

一.数据结构与算法的关系 上一次我大致说了数据结构的一些基本概念,应该还蛮通俗易懂的吧(大概吧!!!).数据结构与算法这两个概念其实是可以单独拿出来讲的,毕竟我们大学有数据结构课,有算法课,单独拿出来讲好像没什么问题,但是数据结构就那么一些(数组.队列.树.图等结构),单独拿出来很快就说完了,但是说完之后,一脸懵逼,两脸茫然,感觉数据结构没什么用啊,但是,注意了啊,但是引入算法,变成程序之后你就会发觉某些特别困难的问题,原来可以用程序这么简单的解决. 所以在我们用程序解决问题看来,程序 = 数据

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)

目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中后序遍历,而这篇文章将是在二叉树的基础上来展开讲解的二叉搜索树,也就是说二叉搜索树建立在树的基础之上.至于博主为何要花一整篇文章来讲这个二叉搜索树呢?原因很简单,红-黑树是基于二叉搜索树的,如果对二叉搜索树不了解,那还谈何红-黑树?红-黑树的重要性我想各位没吃过佩奇肉也肯定看过宜春跑....是的,j

二分算法入门——二分查找

二分查找,无论是从名字还是理论都十分简单一个算法,其博大精深,简直恐怖.Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码. 别人不知道,反正我早上是写了好久,这个查找算法,将查找的复杂度从 o( n ) 降到了 o( logn ) ,当之无愧的的好算法,更是许多高级算法的优化策略之一. 二分查找之基本思路 虽然二分查找是一个很吊的算法,但是跟很多算法一样,需要使用的基础条件——序列有序! 先假设一个单调非增序列:1 2 3 4 5 6 ,求找到3的位置,地球人都会马上这么

程序员,你应该知道的二分查找算法

原理 二分查找(Binary Search)算法,也叫折半查找算法.二分查找的思想非常简单,有点类似分治的思想.二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0. 为了方便理解,我们以数组1, 2, 4, 5, 6, 7, 9, 12, 15, 19, 23, 26, 29, 34, 39,在数组中查找26为例,制作了一张查找过程图,其中low标示左下标,high标示右下标,mid标示中间值下标 二分查

JDK自带的二分查找算法和自己写的普通二分查找算法的比较(java二分查找源代码)

一.描述 解析和比较JDK自带的二分查找算法和自己写的普通二分查找算法,使用二进制位无符号右移来代替除2运算,并使用产生随机数的方法产生一定范围的随机数数组,调用Arrays类的sort()静态方法,对int类型数组进行排序. Math.random()的用法:会产生一个[0,1)之间的随机数(注意能取到0,不能取到1),这个随机数的是double类型,要想返回指定范围的随机数如[m,n]之间的整数的公式:(int)(Math.random()*(m-n+1)+m) 二.源代码 <span st

查找算法系列之简单查找:顺序查找、二分查找、分块查找

近期总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手开始总结查找算法. 废话不多说,这篇文章从最简单的查找算法开始讲起,之后会补充复杂的二叉搜索树查找(BST)和B树,B+树查找以及哈希查找等. 顾名思义,查找就是寻找到关键字在队列中的位置,最笨的查找算法就是依次顺序比较,复杂度为O(n),但是有很多方法的复杂度可以达到O(logn)等等. 1.顺序查找 关键字与数组中的数顺序比较,时间复杂度O(n). template<class T> int OrderS

算法导论 2.3-5 二分查找

1.二分查找(Binary Search) 二分查找又称折半查找,它是一种效率较高的查找方法.    二分查找要求:线性表是有序表,即表中结点按关键字有序,并且表的存储结构为顺序结构.不妨设有序表是递增有序的. 2.二分查找的基本思想 二分查找算法思想: (1)首先确定该区间的中点位置: mid = ( left + right ) / 2; (2)然后将待查的K值与R[mid].key比较,若相等,则查找成功并返回此位置:否则须确定新的查找区间,继续二分查找,具体方法如下: ①若R[mid].

二分查找算法(递归与非递归两种方式)

首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下所示. /* * 非递归二分查找算法 * 参数:整型数组,需要比较的数. */ public static int binarySearch(Integer[]srcArray,int des){ //第一个位置. int low=0; //最高位置.数组长度-1,因为下标是从0开始的. int h