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

news2024/12/22 15:16:34

  数组是一种线性数据结构,把相同数据类型的元素存储在连续的内存空间中,数组的索引(元素在数组中的位置)从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 += num
    return number

print(number) # number = 60

6、数组扩容

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

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

before 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.coloradmin.cn/o/1705183.html

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

相关文章

企业微信hook接口协议,ipad协议http,已读消息

已读消息 参数名必选类型说明uuid是String每个实例的唯一标识,根据uuid操作具体企业微信send_userid是long要发送的人idisRoom是bool是否是群消息 请求示例 {"uuid":"1753cdff-0501-42fe-bb5a-2a4b9629f7fb","send_userid":788130255…

旋转矩阵00

题目链接 旋转矩阵 题目描述 注意点 将图像旋转 90 度不占用额外内存空间 解答思路 需要找到将图像旋转90度的规律,为了不占用额外内存空间,可以先将图像上下翻转,然后再将图像沿着主对角线进行翻转,得到的就是旋转90度之后的…

职业探索--运维体系-SRE岗位/CRE岗位/运维岗位-服务心态-运维职业发展方向-运维对象和运维场景

参考来源: 极客时间专栏:赵成的运维体系管理课 极客时间专栏:全栈工程师修炼指南 赵成大佬在鹏讯云社区的文章(77篇) 有了CMDB,为什么还要应用配置管理 故障没有根因,别再找了 如何理解CMDB的套…

基础—SQL—图形化界面工具的DataGrip使用(2)

一、回顾与引言 (1) 上次内容,博客讲到了DDL语句的数据库操作、表操作、表字段的操作的相关语法,然而之前都是在MySQL的命令行当中去操作演示的。这种方式可以用,但是使用的话,第一,在我们日常…

JVM 内存布局深度解析,你所不知道的一面

作为Java开发者,想要写出高质量的代码,理解JVM的内存结构是必修课。本文将为您深度解析 Java 虚拟机(JVM)中的内存布局及其细节分析,让你在内存管理的道路上行稳致远。希望通过本文能让你彻底理解其中的奥秘。 一、内存布局概览 在我们深入具…

使用EMQX搭建MQTT服务

简介:EMQX 是一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条,单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息,同时保证毫秒…

计算属性与监听属性

【 1 】计算属性 计算属性大致就是这样 # 1 计算属性是基于它们的依赖进行缓存的# 2 计算属性只有在它的相关依赖发生改变时才会重新求值# 3 计算属性就像Python中的property,可以把方法/函数伪装成属性 # 计算属性本质上是一个函数,它们可以通过 get…

国内市场有哪些创意交互性强,重视用户体验的APP/小程序?

在当前互联网时代,随着人口红利的逐渐消退,我们已进入存量用户竞争阶段,用户体验变得尤为关键。优联前端凭借十余年的前端行业经验,始终致力于运用前沿的前端技术、专业的交互设计和细腻的动画视效,为客户提供卓越的用…

LED屏控制卡是如何控制LED屏的?

LED屏控制卡是LED显示屏的关键组件之一,负责将输入的画面信息转换为LED屏能够显示的数据和控制信号。以下是LED屏控制卡的工作原理和功能的详细介绍: 1. LED显示屏控制器概述: LED显示屏控制器是LED显示屏的核心部件之一,也称为LE…

提升PostgreSQL性能的小技巧

提升PostgreSQL性能的技巧可以从多个方面入手,包括硬件配置、数据库配置、查询优化和索引管理。以下是一些实用的技巧: 1. 硬件配置 内存: 增加服务器内存,使更多的数据可以被缓存。 磁盘: 使用SSD硬盘提高读写速度。 CPU: 使用多核CPU&…

华为昇腾310B初体验,OrangePi AIpro开发板使用测评

0、写在前面 很高兴收到官方的OrangePi AIpro开发板测试邀请,在过去的几年中,我在自己的博客写了一系列有关搭载嵌入式Linux系统的SBC(单板计算机)的博文,包括树莓派4系列、2K1000龙芯教育派、Radxa Rock5B、BeagleBo…

智能电表的演进:提升能源管理的效率与可持续性

近年来,随着智能电表的迅速普及,能源行业经历了重大变革。这些创新设备彻底改变了能源的消费、监测和管理方式,提供了前所未有的精确度、实时数据分析以及对能耗的增强控制。智能电表制造商一直处在这一演进的前沿,不断开发和改进…

智能财务分析软件怎么样?看奥威BI现身说法

随着大数据时代的到来,财务分析已不再是简单的数据汇总和报表制作,而是需要运用先进的智能技术,对数据进行深度挖掘和智能分析,以提供有价值的决策支持。在这一背景下,BI智能财务分析软件应运而生,其中奥威…

mars3d实现geojson文件xxx.json格式等实现贴地效果

说明: 1.mars3d.js我们的这个sdk内部参数clampToGround是异步计算贴地效果的,最好的贴地方式是,给json数据准确的带高度的经纬度值。 补充前置知识说明,本身的geojson数据格式每个字段代表的意思需要掌握, GeoJSON …

【Python】 探索Django框架的高并发处理能力

基本原理 Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。Django遵循MVC(模型-视图-控制器)设计模式,提供了一个全栈式的解决方案,使得开发者能够快速构建功能丰富的Web应用。Django的高并发处…

根据经纬度点计算经纬度点之间的距离

根据经纬度点计算经纬度点之间的距离 根据两点经纬度坐标计算直线距离 根据经纬度点计算经纬度点之间的距离 根据经纬度计算两地之间的距离 根据两点经纬度坐标计算距离 其实看第一个就够了 根据 半正矢公式(Haversine formula)即可计算 本计算式选取地…

聚观早报 | 哪吒L纯电版开启预售;OPPO Pad 3获3C认证

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 5月28日消息 哪吒L纯电版开启预售 OPPO Pad 3获3C认证 小米汽车冲刺12万交付量 董明珠称有贡献才能谈收入 苹果…

U-Net网络

U-Net网络 一、基本架构 各个箭头的解释: conv 3 * 3, ReLU:表示通过一个3 * 3的卷积层,并且该层自动附带一个非线性激活层(ReLu)copy and crop:表示进行裁剪然后再进行拼接(在channel的维度上…

界面组件Kendo UI for Angular教程 - 构建强大的PDF阅读器(二)

如今当用户需要处理PDF文件时,通常不得不下载应用程序或者浏览器插件,控制用户如何与PDF交互并不是一件容易的事。如果我们提供PDF作为内容,用户可以下载它并使用浏览器或PDF本身提供的控件进行交互。然而,一些企业可能希望控制用…

摸鱼大数据——Hive官网文档和Hive数据库操作

Hive官网介绍 地址Apache Hive 文档 数据库操作 其他文档 官方文档 hive文档: https://cwiki.apache.org/confluence/display/Hive/ConfigurationProperties Hadoop官网使用说明文档: https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-clien…