当前位置: 首页 > news >正文

python数据结构与算法-02_数组和列表

线性结构

本节我们从最简单和常用的线性结构开始,并结合 Python 语言本身内置的数据结构和其底层实现方式来讲解。
虽然本质上数据结构的思想是语言无关的,但是了解 Python 的实现方式有助于你避免一些坑。

我们会在代码中注释出操作的时间复杂度。

数组 array

数组是最常用到的一种线性结构,其实 python 内置了一个 array 模块,但是大部人甚至从来没用过它。
Python 的 array 是内存连续、存储的都是同一数据类型的结构,而且只能存数值和字符。

我建议你课下看下 array 的文档:https://docs.python.org/2/library/array.html

你可能很少会使用到它(我推荐你用 numpy.array),我将在视频里简单介绍下它的使用和工作方式,最常用的还是接下来要说的 list,
本章最后我们会用 list 来实现一个固定长度、并且支持所有 Python 数据类型的数组 Array.

列表 list

如果你学过 C++,list 其实和 C++ STL(标准模板库)中的 vector 很类似,它可能是你的 Python 学习中使用最频繁的数据结构之一。
这里我们不再去自己实现 list,因为这是个 Python 提供的非常基础的数据类型,我会在视频中讲解它的工作方式和内存分配策略,
避免使用过程中碰到一些坑。当然如果你有毅力或者兴趣的了解底层是如何实现的,可以看看 cpython 解释器的具体实现。

操作平均时间复杂度
list[index]O(1)
list.appendO(1)
list.insertO(n)
list.pop(index), default last elementO(1)
list.removeO(n)

在这里插入图片描述

用 list 实现 Array ADT

讲完了 list 让我们来实现一个定长的数组 Array ADT,在其他一些语言中,内置的数组结构就是定长的。
这里我们会使用 list 作为 Array 的一个成员(代理)。具体请参考视频讲解和代码示例,后边我们会使用到这个 Array 类。

源码

# -*- coding: utf-8 -*-# https://docs.python.org/2/library/array.html
from array import array    # python 提供的比较原始的 array 类arr = array('u', 'asdf')print(arr[0], arr[1], arr[2], arr[3])# 实现定长的 Array ADT,省略了边界检查等class Array(object):def __init__(self, size=32):self._size = sizeself._items = [None] * sizedef __getitem__(self, index):return self._items[index]def __setitem__(self, index, value):self._items[index] = valuedef __len__(self):return self._sizedef clear(self, value=None):for i in range(len(self._items)):self._items[i] = valuedef __iter__(self):for item in self._items:yield itemdef test_array():size = 10a = Array(size)a[0] = 1assert a[0] == 1assert len(a) == 10# py.test array_and_list.py

小问题

  • 你知道线性结构的查找,删除,访问一个元素的平均时间复杂度吗?(后边我们会介绍这个概念,现在你可以简单地理解为一个操作需要的平均步骤)
  • list 内存重新分配的时候为什么要有冗余?不会浪费空间吗?
  • 当你频繁的pop list 的第一个元素的时候,会发生什么?如果需要频繁在两头增添元素,你知道更高效的数据结构吗?后边我们会讲到

延伸阅读

Python list implementation

https://github.com/python/cpython/blob/master/Objects/listobject.c

勘误

视频里的 Array.clear 方法有误。应该是 for i in range(len(self._items)),已经在后续所有使用到 Array 的代码里修正

相关文章:

python数据结构与算法-02_数组和列表

线性结构 本节我们从最简单和常用的线性结构开始,并结合 Python 语言本身内置的数据结构和其底层实现方式来讲解。 虽然本质上数据结构的思想是语言无关的,但是了解 Python 的实现方式有助于你避免一些坑。 我们会在代码中注释出操作的时间复杂度。 数…...

计算机网络基础知识-网络协议

一:计算机网络层次划分 1. 网络层次划分 2. OSI七层网络模型 1)物理层(Physical Layer):及硬件设备,物理层确保原始的数据可在各种物理媒体上传输,常见的设备名称如中继器(Repeater,也叫放大器)和集线器; 2)数据链路层(Data Link Layer):数据链路层在物理层提…...

【Vue3】scoped 和样式穿透

我们使用很多 vue 的组件库&#xff08;element-plus、vant&#xff09;&#xff0c;在修改样式的时候需要进行其他操作才能成功更改样式&#xff0c;此时就用到了样式穿透。 而不能正常更改样式的原因就是 scoped 标记。 scoped 的渲染规则&#xff1a; <template>&l…...

Python 邮件发送(163为例)

代码 import smtplib import socket from email.mime.text import MIMEText from email.header import Headerdef send_mail():# 设置发件人、收件人、主题、内容from_address 18847097110163.comto_address 963268595qq.comsubject test emailbody hahahhahaha# SMTP邮件…...

BlendTree动画混合算法详解

【混合本质】 如果了解骨骼动画就知道&#xff0c;某一时刻角色的Pose是通过两个邻近关键帧依次对所有骨骼插值而来&#xff0c;换句话说就是由两个关键帧混合而来。 那么可不可以由多个关键帧混合而来呢&#xff1f;当然可以。 更多的关键帧可以来自不同的动画片段&#xf…...

2013年01月16日 Go生态洞察:并发不是并行

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

CRM销售管理软件哪个好,该如何选择?(一)

销售团队对于任何一家企业来说都是重中之重&#xff0c;因此我们说一款可以辅助销售人员维护好客户的工具是企业发展的刚需。那么CRM销售管理软件哪个好&#xff0c;该如何选择&#xff0c;从从哪里方面去入手&#xff1f;来看看这两点吧&#xff1a; 功能方面 完整的功能可以…...

Django路由层解析

路由层(urls.py) Django的路由层是用于将URL映射到视图函数的机制。它用于确定请求URL&#xff08;HTTP请求&#xff09;应该被哪个视图函数处理。 Django的路由层包括两个部分&#xff1a; URL模式&#xff1a;匹配请求URL&#xff0c;决定应该使用哪个视图函数来处理请求。UR…...

高教社杯数模竞赛特辑论文篇-2023年A题:定日镜场的输出功率优化(附获奖论文及MATLAB代码实现)(中)

目录 6.4定日镜平均输出热功率优化模型的求解 6.5问题二求解结果 6.6 结果分析...

libusb获取Windows设备实例路径DevicePath

libusb 当前版本&#xff08;1.0.26&#xff09;libusb.h 头文件提供的接口似乎没有办法获取 Windows 平台相关的设备实例路径&#xff0c;其形如&#xff1a; \\?\usb#vid_04ca&pid_7070#5&20d34a76&0&6#{a5dcbf10-6530-11d2-901f-00c04fb951ed} 只是提供了…...

File Upload

File Upload File Upload&#xff08;文件上传&#xff09;&#xff0c;Web应用程序的安全漏洞&#xff0c;如果应用程序未能正确验证和限制用户上传文件的类型、大小和内容。攻击者可以通过构造特制的文件来绕过这些验证&#xff0c;上传包含恶意代码的文件&#xff0c;并在服…...

Qt数据库之QTabelModel

QTabelModel的好处就是不需要执行sql语句就可以对数据库进行操作。 创建数据库&#xff1a; QSqlDatabase DB;//数据库连接 QString aFileQFileDialog::getOpenFileName(this,"选择数据库文件","","SQL Lite数据库(*.db *.db3)"); DBQSqlData…...

计算机视觉(CV)技术的优势和挑战

计算机视觉技术在很多领域具有很大的优势,例如: 自动化:计算机视觉技术可以帮助实现自动化生产和检测,省去了人力成本和时间成本。 准确性:计算机视觉技术可以提高生产和检测的准确性,降低了人工操作产生的误差。 速度:计算机视觉技术可以实现高速速度的生产和检测,提高…...

面试官:【后端一次性返回10万条数据怎么处理/后端发送大数据量的数据如何处理】

文章目录 前言定时器分片处理文档碎片懒加载后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端系列文章 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误…...

深入理解强化学习——多臂赌博机:梯度赌博机算法的数学证明

分类目录&#xff1a;《深入理解强化学习》总目录 通过将梯度赌博机算法理解为梯度上升的随机近似&#xff0c;我们可以深人了解这一算法的本质。在精确的梯度上升算法中&#xff0c;每一个动作的偏好函数 H t ( a ) H_t(a) Ht​(a)与增量对性能的影响成正比&#xff1a; H t …...

StackExchange.Redis 高并发下timeout超时问题如何解决?

查看服务端程序负载还行&#xff0c;根据打印的连接看到一知半懂&#xff0c;按GitHub的issue提示&#xff0c;这2个Busy的数量不能比Min的大&#xff0c;即要提示Min的数值; 的各个字段&#xff1a; Timeout performing EXEC (1000ms): 表示在执行一个事务&#xff08;MULTI..…...

JAVA基础7:数组

1.数组定义格式 1&#xff09;数组概述 一次性声明大量的用于存储数据的变量 要存储的数据通常都是同类型数据&#xff0c;比如&#xff1a;考试成绩 数组&#xff08;array)是一种用于存储多个相同类型数据的存储模型 2&#xff09;数组定义格式 格式一&#xff1a;数据类…...

Riskified: 2023年电商政策滥用问题恶化,正严重挑战商家盈利底线

2023年11月14日&#xff0c;中国上海 —— 近日&#xff0c;由全球领先的电子商务欺诈和风险智能解决方案提供商 Riskified 发布的《政策滥用及其对商家的影响&#xff1a;2023年全球参考基准》报告显示&#xff0c;政策滥用问题正进一步恶化&#xff0c;超过九成电商商家正在承…...

【论文阅读】多模态NeRF:Cross-Spectral Neural Radiance Fields

https://cvlab-unibo.github.io/xnerf-web intro 从不同的light spectrum sensitivity获取信息&#xff0c;同时需要obtain a unified Cross-Spectral scene representation – allowing for querying, for any single point, any of the information sensed across spectra。…...

Huggingface

1 介绍 Hugging Face 是一个开源模型社区。目前已经共享 300k 模型&#xff0c;100k 应用&#xff0c;50k 数据集&#xff08;截至 231114 数据&#xff09;&#xff0c;可视为 AI 界的 github。 2 官网 https://huggingface.co/ 3 主要功能 3.1 Models 模型 大家都用过就…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...