基于Python3的数据结构与算法 - 01 复杂度和列表查找

一、时间复杂度

定义:用来评估算法运行效率的一个式子。

例如:此处的O(1) 详单与一个时间单位

接下来我们看下面两个式子:

如果按照上面的定义,那么打印三次相当O(3),下面的循环相当于O(n2+1)

但是实际不是这样的 

因为这里的时间单位并不是一个精确的时间单位,而是一个大概估计值 ;在计算机中,打印一次和打印三次的时间差不多;此处的时间复杂度对笔者自己而言有点类似于高数中的无穷小概念。

当算法中出现循环规模使得减半,一定会出现logn。

小结

  1. 时间复杂度是用来评估算法运行时间的一个式子(单位)。
  2. 一般来说,时间复杂度高的算法比复杂度低的算法慢。
  3. 常见的时间复杂度有:O(1)<O(logn)<O(n)<O(nlogn)<O({_{n}}^{2})<O(n2logn)<O(n3)
  4. 复杂问题的时间复杂度:O(n!)O({_{2}}^{n})O({_{n}}^{n})...

快速判断算法复杂度(适用于绝大多数情况):

  • 确定问题规模n
  • 循环减半过程→logn
  • k层关于n循环→^{​{_{n}}^{k}}
  • 复杂情况:根据算法执行过程判断

二、空间复杂度

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

空间复杂度的表示方法和时间复杂度完全一样

  • 算法使用了几个变量:O(1)
  • 算法使用了长度为n的一维列表:O(n)
  • 算法使用了m行n列的二维列表:O(mn)

由于当前计算机硬件发展迅速,在写算法期间,我们采用“空间换时间”的方式。即时间的重要性大于空间。

三、递归

递归具有两个特点:

  • 调用自身
  • 结束条件

观察上面四个式子,我们发现:

func1(x)没有结束条件,所以不算递归;

func2(x)同样没有结束条件,所以不算递归;

func3(x)属于递归;假如传入x=3,打印3,2,1

func4(x)属于递归;假如传入x=3,打印1,2,3

四、汉诺塔问题

目的:把圆盘按大小顺序重新摆放到另一根柱子上。

要求:在小圆盘上不能放大圆盘;在三根柱子之间一次只能移动一个圆盘。

对于n个盘子是:

  1. 把n-1个圆盘从A经过C移动到B
  2. 把第n个圆盘从A移动到C
  3. 把n-1个小圆盘从B经过A移动到C

汉诺塔移动次数的递推式:h(n) = 2h(n-1)+1

可得h(64) = 18446744073709551615

如果婆罗门每秒钟搬一个盘子,则总共需要5800亿年。

示例代码如下:

def hanoi(n, a, b, c):  # 目的是经过b从a移动到c
    if n > 0:
        hanoi(n - 1, a, c, b)  # 第一步,把n-1个盘子从a经过c移动到b
        print("moving from %s to %s" % (a, c))  # 第二步,把第n个盘子从a移动到b
        hanoi(n - 1, b, a, c)  # 第三步,把n-1个盘子从b经过a移动到c


hanoi(3, "A", "B", "C")

输出结果如下:

输出结果即对应3层的汉诺塔操作步骤。

五、列表查找

查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程。

列表查找(线性表查找):从列表中查找元素

  • 输入:列标、待查找元素
  • 输出:元素下标(未找到元素时一般返回None或-1)

内置列标查找函数:index()

1. 顺序查找

顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素搜索到列表最后一个元素为止。

def linear_search(li, val):  # li为一个列表;val为目标值
    for ind, v in enumerate(li):  # 遍历列表
        if v == val:  # 找到目标值
            return ind
    else:
        return None  # 未找到目标值

2. 二分查找(Binary Search)

二分查找:又叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值候选区中间值的比较,可以使后翔安区减少一半。(前提是有序列表;如果是无序列表,若只查找一次,还是采用线性查找较好;若需要查找n次,则先排序。再采样二分查找较好

假如目前存在一个有序列表:

我们需要从列表中查找元素3:

  1.  设置两个变量:left和right
  2. 初始的时候:left=0;right=len(list)-1(列表第一个元素和最后一个元素)
  3. 求中间元素 mid=(left+right)/2 = 4 (索引)
  4. 因为mid>3;此时让right = mid-1 = 3(索引)
  5. 再计算新的mid比较目标值:mid = (left+right)/2 = 1.5 取1
  6. mid = 2<3;此时让left = mid+1 = 2
  7. 此时只有两个值:left = 2; right = 3; mid = (left+right)/2 =2.5取2

示例代码如下:

def binary_search(li, val):
    left = 0
    right = len(li) - 1
    while left <= right:  # 候选去有数值
        # mid = int((left + right) / 2)
        mid = (left + right) // 2
        if li[mid] == val:
            return mid
        elif li[mid] > val:  # 待查找的值在mid左侧
            right = mid - 1
        else:
            left = mid + 1
    else:
        return None


li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(binary_search(li, 6))

因为二分查找每次使得候选区元素减半,因此时间复杂度为O(logn)。

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/394558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

KUKA库卡机器人编程语言是什么?

KUKA库卡机器人的编程语言主要是KUKA Robot Language&#xff08;简称KRL&#xff09;。KRL是库卡机器人专门为其机器人系统设计的编程语言&#xff0c;用于编写和控制KUKA工业机器人的运动和操作。KRL结合了指令式编程和结构化编程的特点&#xff0c;具有一定的易学性和灵活性…

软考29-上午题-排序

一、排序的基本概念 1-1、稳定性 稳定性指的是相同的数据所在的位置经过排序后是否发生变化。若是排序后&#xff0c;次序不变&#xff0c;则是稳定的。 1-2、归位 每一趟排序能确定一个元素的最终位置。 1-3、内部排序 排序记录全部存放在内存中进行排序的过程。 1-4、外部…

微信小程序之开发会议OA项目

目录 前言 本篇目标 首页 会议 投票 个人中心 会议OA项目-首页 配置 tabbar mock工具 page swiper 会议信息 会议OA项目-会议 自定义tabs组件 会议管理 会议OA项目-投票 会议OA项目-个人中心 前言 文章含源码资源&#xff0c;投票及个人中心详细自行查看…

【Python如何求出斐波那契数列】

1、斐波那契python代码如下&#xff1a; # python如何求斐波那契数列 def fib(num): # 用来求出第num个的斐波那契数列的值if num 0 or num 1:return 1else:num fib(num - 1) fib(num - 2)return num def fiblist(n): # 用来求出前n个值的斐波那契数列fb_list []for i …

单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法(matlab代码)

目录 1 主要内容 目标函数 电动汽车负荷建模 算例系统图 程序亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现博士文章《互动环境下分布式电源与电动汽车充电站的优化配置方法研究》第五章《单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法》…

PMBus > SMBus > I2C 关系解析

一、SMBUS SMBus 全称 System Management Bus&#xff0c;即系统管理总线。一种基于I2C而扩展出来的协议&#xff0c;是 I2C 协议的一个子集。但SMBus 要求更严格&#xff0c;规定了更多细节与规范。有一些更为复杂的操作&#xff0c;但是原理都还是基于I2C。 SMBus 为系统和电…

05.QT坐标系

1. 坐标系原点 坐标系原点就是屏幕/窗口的左上角&#xff0c;X向右增长&#xff0c;Y向下增长。 2.设置控件位置 设置控件位置&#xff0c;就相当于是需要指定控件的坐标&#xff0c;对于该控件来说&#xff0c;其坐标原点是其父窗口/父控件的左上角。 设置方法就是通过控件的…

8.可观测性

可观测性 readinessProbe 就绪探针 Pod生命周期有几个不同阶段,Pod会有不同的状态。 刚创建Pod时,Pod处于Pending状态&#xff61;调度程序会尝试找出放置Pod的位置&#xff61;如果调度程序找不到要放置Pod的节点,它将保持Pending状态&#xff61; 运行kubectl describe po…

【DBeaver+mysql】如何在DBeaver中创建mysql服务的连接并新建数据库

一、创建步骤 1、下载安装mysql 8.0&#xff08;注意&#xff0c;安装过程会启动mysql服务&#xff0c;这才是能用命令行执行node处理sql语句的关键&#xff09; 下载地址&#xff1a;https://dev.mysql.com/downloads/file/?id526407 2、下载安装DBeaver数据库管理IDE 3、在…

循环队列|超详细|数据结构学习讲解与笔记

队列元素先进先出队列只允许在线性表的一端进行操作&#xff0c;是一种操作受限的线性表 队列的基本操作 InItQueue(&Q)初始化队列&#xff0c;构造一个空队列 QEmptyQueue(Q)队列判空FullQueue(Q)队列判满EnQueue(&Q , x)入队操作DeQueue(&Q , &x)出队操作G…

铌酸锂芯片与精密划片机:科技突破引领半导体制造新潮流

在当今快速发展的半导体行业中&#xff0c;一种结合了铌酸锂芯片与精密划片机的创新技术正在崭露头角。这种技术不仅引领着半导体制造领域的进步&#xff0c;更为其他产业带来了前所未有的变革。 铌酸锂芯片是一种新型的微电子芯片&#xff0c;它使用铌酸锂作为基底材料&#x…

HTTP/1.1 如何优化?

问你一句:「你知道 HTTP/1.1 该如何优化吗?」 我们可以从下面这三种优化思路来优化 HTTP/1.1 协议: 尽量避免发送 HTTP 请求在需要发送 HTTP 请求时&#xff0c;考虑如何减少请求次数减少服务器的 HTTP 响应的数据大小 下面&#xff0c;就针对这三种思路具体看看有哪些优化…

【代码移植】UNIX/Linux/POSIX代码程序移植到Windows系统平台技术汇总与经验分享

​ 图片来源 UNIX (Linux) to Windows代码移植技术路线 MinGW MinGW/MinGW-W64是用Windows原生系统API实现的&#xff0c;在Windows上运行的GCC编译工具链&#xff0c;可以编译出Windows原生应用程序。 MinGW编译工具链的生态位和微软官方的MSVC类似。 优点 MinGW编译出…

(每日持续更新)jdk api之ObjectInputValidation基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

fish终端下conda activate失败

【问题】fish终端下激活conda环境报错&#xff1a; >> conda activate base CondaError: Run conda init before conda activate ## 然而运行 conda init fish 仍旧无法解决【解决】 参考&#xff1a;https://github.com/conda/conda/issues/11079 方法一&#xf…

SQL-Labs靶场“1-5”关通关教程

君衍. 一、准备工作二、第一关 基于GET单引号字符型注入1、源码分析2、联合查询注入过程 三、第二关 基于GET整型注入1、源码分析2、联合查询注入过程 四、第三关 基于GET单引号变形注入1、源码分析2、联合查询注入过程 五、第四关 基于GET双引号字符型注入1、源码分析2、联合查…

JDBC核心技术

第1章 JDBC概述 第2章 获取数据库连接 第3章 使用PreparedStatement实现CRUD操作 第4章 操作BLOB类型字段 第5章 批量插入 第6章 数据库事务 第7章 DAO及相关实现类 第8章 数据库连接池 第9章 Apache-DBUtils实现CRUD操作图像 小部件

提高供应商收发文件效率的同时,如何保障数据的安全流转?

数据文件是制造业企业的核心竞争力&#xff0c;一旦发生数据外泄&#xff0c;就会给企业造成经济损失。之前就出现过像小米二级供应商因对其下游供应商管理不善&#xff0c;泄露了小米汽车前后保险杠的早期设计稿事件。制造业企业与供应商之间业务联系紧密&#xff0c;文件流转…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(二)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

AWK语言

一. awk awk&#xff1a;报告生成器&#xff0c;格式化输出。 在 Linux/UNIX 系统中&#xff0c;awk 是一个功能强大的编辑工具&#xff0c;逐行读取输入文本&#xff0c;默认以空格或tab键作为分隔符作为分隔&#xff0c;并按模式或者条件执行编辑命令。而awk比较倾向于将一行…