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

news2025/1/17 3:55:33

一、时间复杂度

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

例如:此处的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)。

  

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO v5项目实战 P5 解决运行detect文件时设置了--view-img但是显示不出来的问题

up主讲的实时显示目标检测后的图片的两种方法&#xff1a; &#xff08;1&#xff09;在下面的Terminal中输入下列命令&#xff1a; python detect.py --view-img &#xff08;2&#xff09;点击进入右上方的detect的Edit Configurations 然后在这个参数这里输入 --view img…

Pulsar-架构与设计

Pulsar架构与设计 一、背景和起源二、框架概述1.设计特点2.框架适用场景 三、架构图1.Broker2.持久化存储&#xff08;Persistent storage&#xff09;3.Pulsar元数据&#xff08;Metadata store&#xff09; 四、功能特性1.消息顺序性2.消息回溯3.消息去重4.消息重投递5.消息重…

一键安装ROS适用于Ubuntu22/20/18

一键安装ROS适用于Ubuntu22/20/18 1、简介 ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;是一个用于机器人软件开发的框架。它提供了一套工具和库&#xff0c;用于机器人应用程序的开发、测试和部署。ROS是由美国斯坦福大学机器人实验室&…

银河麒麟操作系统自动同步时间更新

1、银河麒麟操作系统基于Centos8的&#xff0c;因centos8取消了ntp服务器&#xff0c;所以导致之前使用ntpdate命令无法同步时间 2、centos默认使用chrony模块来进行同步时间 3、修改chrony配置同步时间服务器 vim /etc/chrony.conf 4、目前使用的是阿里云的时间服务器&…

2024年初中生古诗文大会安排预测和备考建议、资料

今天&#xff08;2024年2月19日&#xff09;是上海市中小学正式开学的日子&#xff0c;神兽归位&#xff0c;各位家长可以松口气了&#xff0c;为孩子规划今年的竞赛、学科活动了。根据一些家长朋友的咨询&#xff0c;今天六分成长介绍2024年中学生古诗文大会&#xff08;初中组…

图数据库 之 Neo4j - Cypher语法基础(5)

节点(Nodes) Cypher使用()来表示一个节点。 () # 最简单的节点形式&#xff0c;表示一个任意无特征的节点&#xff0c;其实就是一个空节点(movie) # 如果想指向一个节点在其他地方&#xff0c;我们可以给节点添加一个变量名(如movie)&#xff0c;表示一个变量名为 movie的节点…

SQL Developer 小贴士:Unshared Worksheet

在Oracle SQL Developer中&#xff0c;最常用的功能应该是SQL Worksheet&#xff0c;或Worksheet。 可以创建两类Worksheet&#xff0c;即Worksheet和Unshared Worksheets。前者是共享数据库连接的&#xff0c;后者会单独创建自己的连接。前者的快捷键是AltF10&#xff1b;后者…

SSM项目启动错误[main] ERROR org.springframework.boot.SpringApplication

[main] ERROR org.springframework.boot.SpringApplication - Application run failed org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1 这个错误是由于Spring Boot应用程序在解析YAML文件时遇到了字符编码问题。java.ni…

国产降压芯片 小封装 外围简单 支持36V 48V 60V 85V 100V电压-H6225L

国产降压芯片&#xff0c;也就是由中国企业设计和生产的用于电压转换的集成电路芯片&#xff0c;随着国内半导体产业的快速发展&#xff0c;这些芯片已经开始在一些领域显示出其优势。主要优势涵盖以下几个方面&#xff1a; 成本优势&#xff1a;国产降压芯片因为本土化生产&a…

NLP_GPT生成式自回归模型

文章目录 介绍完整代码小结 介绍 自回归(Autoregressive)是自然语言处理模型的一种训练方法&#xff0c;其核心思想是基于已有的序列(词或字符)来预测下一个元素。在GPT中&#xff0c;这意味着模型会根据给定的上文来生成下一个词&#xff0c;如图所示。 在GPT模型的训练和推…

数据分析 — 动画图 pyecharts

目录 一、概念二、安装和导入三、绘图逻辑四、绘图1、柱状图2、折线图3、散点图4、饼图5、南丁格尔图6、Geo() 地理坐标第7、Map() 绘制区域8、词云图9、层叠图10、3D 图11、仪表板 一、概念 Pyecharts 是一个基于 Echarts 的 Python 可视化库&#xff0c;它通过 Python 生成 …

猪圈Pigsty-PG私有RDS集群搭建教程

博客 https://songxwn.com/Pigsty-PG-RDS/ 简介 Pigsty 是一个更好的本地自建且开源 RDS for PostgreSQL 替代&#xff0c;具有以下特点&#xff1a; 开箱即用的 PostgreSQL 发行版&#xff0c;深度整合地理、时序、分布式、图、向量、分词、AI等 150 余个扩展插件&#xff…

OpenAI Sora —— 文生视频为何如此逼真?AI算法架构解析

OpenAI于2024年2月16日发布了名为Sora的文生视频模型。Sora是一个革命性的视频生成模型&#xff0c;可以根据用户输入的简单文本脚本自动生成与好莱坞级别画面相媲美的视频内容&#xff0c;其生成的视频不仅仅是对已有素材的拼接或剪辑合成&#xff0c;而是从像素级别全新“绘制…

【Jvm】性能调优(上)线上问题排查工具汇总

文章目录 一.互联网概念1.产品闭环和业务闭环2.软件设计中的上游和下游3.JDK运行时常量池 二.CPU相关概念1.查询CPU信息2.CPU利用率&#xff08;CPU utilization&#xff09;和 CPU负载&#xff08;CPU load&#xff09;2.1.如何理解CPU负载2.2.top命令查看CPU负载均值2.3.CPU负…

动态头部:统一目标检测头部与注意力

论文地址:https://arxiv.org/pdf/2106.08322.pdf ai阅读论文_论文速读_论文阅读软件-网易有道速读 创新点是什么? 这篇文档的创新点是提出了一种统一的方法&#xff0c;将对象检测头和注意力机制结合起来。作者在文中提出了一种称为Dynamic Head的方法&#xff0c;通过引入…

Android 15 第一个开发者预览版

点击查看&#xff1a;first-developer-preview-android15 点击查看&#xff1a;Get Android 15 2024年2月16日,谷歌发布 Android 15 第一个开发者预览版 翻译 由工程副总裁戴夫伯克发布 今天&#xff0c;我们发布了Android 15的首个开发者预览版&#xff0c;这样我们的开发者就…

[技术杂谈]Chat With RTX 介绍

英伟达&#xff08;Nvidia&#xff09;已于近日发布了名为“Chat with RTX”的Demo版个性化AI聊天机器人&#xff0c;并在其海外官网渠道中提供了下载链接。 据了解&#xff0c;这是一款适用于Windows平台的聊天机器人&#xff0c;由TensorRT-LLM提供支持&#xff0c;完全在本地…

机器人革命:从斯坦福的通用操作接口到OpenAI的Sora,塑造未来的合成学习

引言 在机器人成为平凡工匠和前沿先驱的时代&#xff0c;我们正站在新黎明的边缘。本文将探讨斯坦福大学的通用操作接口&#xff08;UMI&#xff09;及其与OpenAI的Sora如何共同推进机器人技术&#xff0c;开创未来学习的新纪元。 正文 斯坦福的通用操作接口&#xff08;UMI…

电脑文件大爆炸,快用知识管理 | 咨询案例

在刚刚过去的春节假期&#xff0c;意料之外地完成了一次关于个人知识管理实践的咨询。为此&#xff0c;要特别感谢李博和双红老师的引介&#xff0c;使我有机会在帮助他人实践落地个人知识管理系统的同时&#xff0c;丰富了自己的经验积累和案例库。话不多说&#xff0c;来做个…

MySQL-锁(LOCK)

文章目录 1. 锁是什么&#xff1f;2. 全局锁2.1 相关语法2.2 特点 3. 表级锁3.1 表锁3.1.1 共享读锁&#xff08;S&#xff09;3.1.2 排它写锁&#xff08;X&#xff09; 3.2 元数据锁&#xff08;MDL&#xff09;3.2 意向锁&#xff08;IS、IX&#xff09; 4. 行级锁4.1 行锁 …