数据结构与算法之线性表01

  数组是一种线性数据结构,把相同数据类型的元素存储在连续的内存空间中,数组的索引(元素在数组中的位置)从0开始。

一、常用操作:

1、初始化

# 给定初始值
arr:list[int] = [0] * 5
nums:list[int] = [1, 2, 3, 4, 5]

2、查询/访问元素

数组的首元素对应的索引为0,这与现实生活中的序号有些不太一样,但可以从地址计算的角度分析看,索引本质是内存地址的偏移量。

元素对应的内存地址=数组首元素地址+地址偏移量

地址偏移量=(每个元素对应的大小/长度)*  元素索引 

def random_visit(nums:list[int]) -> int:"""随机访问nums中的任意一个元素"""random_index = random.randint(0,len(nums) - 1)return nums[random_index]

3、插入元素

定义:有效数字表示为有用的存储数据;无效数据表示初始化的数据(比如:全部初始化为0)。

由于数组中的数据为连续存储,所以当在第i个位置(i不是当前数组的最后一位有效数字的索引)插入新的数据时,并没有地方存储,因此需要将当前数组中第i个数据之后的数据依次向后移动(索引i+1)一个单元,但又由于数组长度不可变,有可能会导致数组后面被初始化为0的元素产生丢失,此问题可通过后续的列表解决。

def insert(nums:list[int], num:int, index:int):"""在数组的索引index处插入元素num"""# 1、从后向前遍历nums到索引index处# 2、把num插入到索引index处for i in range(len(nums) - 1,index,-1):nums[i] = nums[i-1]nums[index] = num# before insert:nums = [1, 2, 3, 4, 5]
# after insert 0 in index 0:num = [0, 1, 2, 3, 4] 

4、删除元素 

同样的,删除顺序存储的任意索引i处的元素时,把索引i+1的元素依次向前移动。由于数组大小固定不变,因此删除中间某个元素值后,会依次向前移动,但最后一个元素并未删掉。

def remove(nums:list[int],index:int):"""在数组的索引index处删除索引index的元素"""for i in range(index,len(nums) - 1):nums[i] = nums[i+1]# before delete:nums = [1, 2, 3, 4, 5]
# after delete index 0:nums = [2, 3, 4, 5, 5]

 5、遍历及访问数组元素

def traverse(nums:list[int]) -> int:"""遍历数组"""number = 0# 1、通过下标访问for i in range(len(nums)):number += nums[i]# 2、直接遍历数组元素for i in nums:number += i# 3、同时遍历索引及数组元素:for i,num in enumerate(nums):number += nums[i]number += numreturn numberprint(number) # number = 60

6、数组扩容

 数组的长度是不可变的,对其扩容实际就是新建一个数组(容量扩大),然后将原数组的值拷贝到新数组中即可。

def expand(nums:list[int],enlarge:int) -> list[int]:"""数组扩容"""# 1、初始化一个扩展长度的数组arrarr = [0] * (len(nums) + enlarge)# 2、将原数组中所有元素复制到新数组for i in range(len(nums)):arr[i] = nums[i]return arrbefore expand:nums = [1, 2, 3, 4, 5]
after expand capicity:nums = [1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

二、总结

1、优缺点

ef98706c5279494a8f24e236588f0ee3.png

 2、应用

482004714e9b4ef58751c5b9102c0f35.png

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于EBAZ4205矿板的图像处理:10gamma变换

基于EBAZ4205矿板的图像处理:10gamma变换 项目全部文件 会上传项目全部文件,如果没传,可以私信催我一下,最近太忙了 先看效果 我的项目中的gamma的变换系数为2.2,是会让图像整体变暗的,看右图说明我的ga…

1992-2022年经过矫正的夜间灯光数据

DMSP/OLS夜间灯光的年份是1992-2013年,NPP/VIIRS夜间灯光的年份是2012-2021,且由于光谱分辨率、空间分辨率、辐射分辨率、产品更新周期等方面的差异,DMSP-OLS和SNPP-VIIRS数据不兼容,也就是说我们无法直接对比分析DMSP-OLS和SNPP-…

多线程基本常识

多线程的状态 在Java中,一个线程的生命周期有以下几种状态: 新建(New):当线程对象被创建时,线程处于新建状态。此时线程对象存在,但还没有调用start()方法启动线程。 运行(Runnable…

满帮集团 Eureka 和 ZooKeeper 的上云实践

作者:胡安祥 满帮集团,作为“互联网物流”的平台型企业,一端承接托运人运货需求,另一端对接货车司机,提升货运物流效率。2021 年美股上市,成为数字货运平台上市第一股。根据公司年报,2021 年&a…

C++ (week5):Linux系统编程3:线程

文章目录 三、线程1.线程的基本概念①线程相关概念②我的理解 2.线程的基本操作 (API)(1)获取线程的标识:pthread_self(2)创建线程:pthread_create()(3)终止线程①pthread_exit():当前线程终止,子线程主动退出②pthread_cancel()&…

深入解析BGP:互联网路由协议的全貌与应用

BGP(Border Gateway Protocol)是互联网上用于在自治系统(AS)之间交换路由信息的协议。它负责决定数据包的最佳路径以及路由的选择。以下是BGP的一些关键特点和工作原理的详细内容: BGP的特点: 1.路径矢量型…

Android开发 -- JNI开发

1.配置JNI环境 创建JNI文件夹 在项目的主目录中创建一个名为 JNI 的文件夹。这个文件夹将包含所有的本地源代码和配置文件。 编写Android.mk文件 这个文件是一个 Makefile,用来指导 NDK 如何编译和构建本地代码。 #清除之前定义的变量,确保每个模块的…

《python编程从入门到实践》day40

# 昨日知识点回顾 编辑条目及创建用户账户 暂没能解决bug: The view learning_logs.views.edit_entry didnt return an HttpResponse object. It returned None instead.# 今日知识点学习 19.2.5 注销 提供让用户注销的途径 1.在base.html中添加注销链接 …

运维笔记.Docker镜像分层原理

运维专题 Docker镜像原理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/artic…

探讨大米自动化生产线包装设备的智能化发展趋势

随着科技的飞速发展,智能化已经成为各行各业转型升级的重要方向。在大米生产领域,自动化生产线包装设备的智能化发展更是引领着粮食产业的未来潮流。星派将从智能化技术、市场需求、发展趋势等方面,探讨大米自动化生产线包装设备的智能化发展…

java图书电子商务网站的设计与实现源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书电子商务网站的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 图书电子商…

鸿蒙ArkTS声明式开发:跨平台支持列表【按键事件】

按键事件 按键事件指组件与键盘、遥控器等按键设备交互时触发的事件,适用于所有可获焦组件,例如Button。对于Text,Image等默认不可获焦的组件,可以设置focusable属性为true后使用按键事件。 说明: 开发前请熟悉鸿蒙开…

嵌入式进阶——外部中断(EXTI)

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 STC8H中断外部中断外部中断编写配置外部中断调用中断触发函数 外部中断测试测试外部中断0测试外部中断2、3或者4 PCB中断设计 STC8…

echarts取消纵坐标,自定义提示内容,完整 echarts 布局代码

效果图 实现代码 开启点击柱子时的提示内容 //完整写法请看下面tooltip: {trigger: axis,axisPointer: {type: shadow}},自定义提示内容 //完整写法请看下面formatter: function (param) {// param是悬浮窗所在的数据(x、y轴数据)let relVal "&…

【华为】将eNSP导入CRT,并解决不能敲Tab问题

华为】将eNSP导入CRT,并解决不能敲Tab问题 eNSP导入CRT打开eNSP,新建一个拓扑右键启动查看串口号关联CRT成功界面 SecureCRT连接华为模拟器ensp,Tab键不能补全问题选择Options(选项)-- Global Options (全局选项&#…

LangChain技术解密:构建大模型应用的全景指南

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

vue3父组件改变 子组件不改变(uniapp)

项目中遇到了这么个问题 场景:封装select组件,通过子组件选中后传递值给父组件,父组件需要回显这个值(这里使用 defineProps和defineEmits就可以实现,或者直接使用defineModel也可以实现,但是uniapp目前不…

学习编程对英语要求高吗?

学习编程并不一定需要高深的英语水平。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。 虽然一些编程资源和文档可能…

AI大模型在测试中的深度应用与实践案例

文章目录 1. 示例项目背景2. 环境准备3. 代码实现3.1. 自动生成测试用例3.2. 自动化测试脚本3.3. 性能测试3.4. 结果分析 4. 进一步深入4.1. 集成CI/CD管道4.1.1 Jenkins示例 4.2. 详细的负载测试和性能监控4.2.1 Locust示例 4.3. 测试结果分析与报告 5. 进一步集成和优化5.1. …

文件上传漏洞:pikachu靶场中的文件上传漏洞通关

目录 1、文件上传漏洞介绍 2、pikachu-client check 3、pikachu-MIME type 4、pikachu-getimagesize 最近在学习文件上传漏洞,这里使用pikachu靶场来对文件上传漏洞进行一个复习练习 废话不多说,开整 1、文件上传漏洞介绍 pikachu靶场是这样介绍文…