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

devtools/2024/9/25 5:54:20/

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

一、常用操作:

1、初始化

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

2、查询/访问元素

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

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

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

python">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的元素产生丢失,此问题可通过后续的列表解决。

python">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的元素依次向前移动。由于数组大小固定不变,因此删除中间某个元素值后,会依次向前移动,但最后一个元素并未删掉。

python">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、遍历及访问数组元素

python">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、数组扩容

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

python">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.ppmy.cn/devtools/43359.html

相关文章

Leetcode 力扣95. 不同的二叉搜索树 II (抖音号:708231408)

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1: 输入:n 3 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null…

GO语言 linux部署

https://blog.csdn.net/wangye135/article/details/136177171 一、简述 1. 可以直接在服务器上运行编译好的二进制文件,不需要在服务器上下载语言环境。 2. 内置运行时环境:可执行文件中内置了运行时环境,包括垃圾回收、调度器等&#xff…

从计划到行动:BI项目中PDCA闭环思维如何转化为实践?

在当今快节奏的商业环境中,项目管理的质量直接影响到企业的运营效率和竞争力。为了确保项目能够高效、顺利地进行,并达到预期目标,企业需要采用系统化的管理方法来指导项目的实施。PDCA(Plan-Do-Check-Act)循环&#x…

芯片固定uv胶有什么优点?

芯片固定uv胶有什么优点? 芯片固定UV胶具有多种优点,这些优点使得它在半导体封装和芯片固定等应用中成为理想的选择。以下是芯片固定UV胶的一些主要优点: 固化速度快:UV胶在紫外线照射下能迅速固化,通常在几秒到几十秒…

QT C++ 模型视图结构 QTableView 简单例子

在Qt中,MVC模式被广泛使用于各种用户界面框架中,包括Qt的模型视图结构。Qt的模型视图结构是基于MVC模式设计的,其中包括了Model、View和Delegate三个部分。 QTableView是Qt模型视图结构中的一种视图,它用于以表格形式显示数据。 …

Java如何将tif格式图片转为jpg格式图片

在Java中,将TIFF(.tif)格式的图片转换为JPEG(.jpg)格式的图片,通常需要使用图像处理库,如Apache Commons Imaging(之前称为Sanselan)或Java Advanced Imaging (JAI)。但是…

当下sprign boot最火最全的经典面试题

基础概念 什么是Spring Boot?Spring Boot的核心优势是什么?Spring Boot与传统的Spring MVC项目相比,有哪些显著的区别?Spring Boot如何实现“约定优于配置”原则?请举例说明。解释Spring Boot中的Starter POMs概念及其…

抖音视频怎么去水印保存部分源码|短视频爬虫提取收集下载工具

抖音视频怎么去水印保存部分源码|短视频爬虫提取收集下载工具 抖音视频去水印保存部分源码: 通过使用Python中的requests、re和os等库,可以编写如下代码来实现抖音视频去水印保存的功能。 短视频爬虫提取手机下载工具的使用方法: 该工具主…