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

数据结构之数组:简介、特性与应用

文章目录

    • 🌾引言
    • 🌾数组的定义与特性
      • 🌿数组的定义
      • 🌿数组的特性
      • 🌿数组的优缺点
    • 🌾数组的应用场景
      • 🍁数组的基本应用
      • 🍁动态数组(Dynamic Array)
      • 🍁多维数组
      • 🍁字符串
    • 🌾数组的常见操作与算法
      • 🍁初始化与访问
      • 🍁插入与删除
      • 🍁数组的排序算法
      • 🍁数组的搜索算法
    • 🌾数组的性能分析与优化
      • 🌱数组的时间复杂度
      • 🌱数组的空间复杂度
      • 🌱数组的优化策略
    • 🌾结论
    • 🥦代码示例
    • 🥝参考文献:

🌾引言

数据结构是计算机科学中一门重要的基础课程,它以存储和组织数据的方式为主要研究对象。而在数据结构中,数组(Array)是最基本、最常用的数据结构之一。本篇博客将介绍数组的概念、特性以及在实际应用中的使用场景,希望能够帮助读者加深对数组的理解与应用。

🌾数组的定义与特性

🌿数组的定义

数组是一种线性数据结构,它由相同类型的元素组成,并根据元素在内存中的顺序进行存储和访问。
数组的长度是固定的,一旦初始化后,其大小不可改变。

🌿数组的特性

数组的元素在内存中是连续存储的,这也是数组能够快速访问元素的原因之一。
数组可以通过索引访问元素,索引从0开始,依次递增。
数组支持随机访问,即可以根据索引直接访问任意位置的元素。
数组的访问时间复杂度为O(1),这使得它成为处理大量数据的重要工具。

🌿数组的优缺点

优点:高效的随机访问、连续存储、简单易用。
缺点:长度固定、插入与删除元素时需要移动其他元素。

🌾数组的应用场景

🍁数组的基本应用

在算法和程序设计中,数组被广泛应用于排序、搜索、哈希表等基础算法和数据结构中。
数组还常用于存储一组具有相似特征的数据,如学生成绩、员工工资等。

🍁动态数组(Dynamic Array)

动态数组是指能够根据需要自动扩展大小的数组。
动态数组结合了数组的高效随机访问和动态大小的优点,广泛用于动态增长的数据集合。
代码示例:

# 创建一个空的动态数组
dynamic_arr = []# 添加元素到动态数组末尾
dynamic_arr.append(1)
dynamic_arr.append(2)
dynamic_arr.append(3)
print("动态数组:", dynamic_arr)# 获取动态数组长度
print("动态数组长度为:", len(dynamic_arr))# 修改动态数组元素
dynamic_arr[1] = 5
print("修改后的动态数组:", dynamic_arr)# 删除动态数组元素
dynamic_arr.pop(0)
print("删除元素后的动态数组:", dynamic_arr)

🍁多维数组

多维数组是指具有多个维度的数组,如二维数组、三维数组等。
多维数组常用于表示矩阵、图像、游戏地图等需要多个维度来描述的数据结构。
代码示例:

# 创建一个二维数组
arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("初始数组:")
for row in arr:print(row)# 获取二维数组行数和列数
rows = len(arr)
cols = len(arr[0])
print("行数:", rows)
print("列数:", cols)# 访问二维数组元素
print("第二行第三个元素:", arr[1][2])# 修改二维数组元素
arr[0][1] = 10
print("修改后的数组:")
for row in arr:print(row)

🍁字符串

字符串可以被看作是字符的数组,因此数组的一些特性也适用于字符串。
字符串处理中,数组常用于存储和操作字符串中的字符。

🌾数组的常见操作与算法

🍁初始化与访问

数组的初始化可以使用静态初始化或动态初始化的方式。
数组的元素可以通过索引进行访问和修改。

🍁插入与删除

插入与删除元素时需要考虑数组长度的变化以及其他元素的移动。
插入元素的时间复杂度为O(n),删除元素的时间复杂度同样为O(n)。

代码示例见文章结尾的代码示例

🍁数组的排序算法

数组排序是数组应用中的一种重要操作,常见的排序算法包括冒泡排序、插入排序、快速排序等。
各种不同的排序算法具有不同的时间复杂度和空间复杂度,可以根据具体情况选择合适的算法。
插入排序代码示例:排序算法有很多种,在这里不一一例举

def insertion_sort(arr):# 遍历数组中的每个元素for i in range(1, len(arr)):key = arr[i]  # 当前要插入的元素j = i - 1     # 已排序部分的最后一个元素的索引# 将大于key的元素后移,为key腾出位置while j >= 0 and arr[j] > key:arr[j + 1] = arr[j]j -= 1arr[j + 1] = key  # 插入key到正确位置# 测试
arr = [5, 2, 9, 1, 3]
print("原始数组:", arr)
insertion_sort(arr)
print("排序后的数组:", arr)

🍁数组的搜索算法

数组的搜索算法用于查找给定值在数组中的位置或判断是否存在某个值。
常见的搜索算法包括线性搜索、二分搜索、哈希表等,每种算法都有其适用的场景和特点。

🌾数组的性能分析与优化

🌱数组的时间复杂度

数组具有快速访问元素的优势,其访问、插入、删除的时间复杂度均为O(1)。
但在插入和删除元素时,需要移动其他元素,会带来一定的时间开销。

🌱数组的空间复杂度

数组的空间复杂度为O(n),其中n为数组的长度。
数组的固定长度可能导致内存浪费,动态数组可在一定程度上缓解这个问题。

🌱数组的优化策略

使用动态数组解决固定长度的问题,减少内存浪费。
对于频繁的插入和删除操作,可以考虑使用链表等数据结构替代数组。
在实际使用中,需要根据具体场景和需求进行性能分析,并选择合适的数据结构来优化数组操作。

🌾结论

数组作为一种最基本、最常用的数据结构之一,在计算机科学中具有重要的地位和作用。通过对数组的概念、特性和应用进行介绍,我们可以更好地理解和应用数组。同时,了解数组的优缺点、常见操作与算法,以及性能分析与优化策略,有助于我们在实际开发中更加高效地利用数组。希望本篇博客能够帮助读者深入理解数组,并在解决实际问题中发挥其作用。

🥦代码示例

以下为一个 Python 中的数组示例:

# 创建一个数组
arr = [1, 2, 3, 4, 5]
print("初始数组:", arr)# 数组元素访问
print("数组第二个元素:", arr[1])  # 第二个元素的索引为1
print("数组倒数第二个元素:", arr[-2])  # 倒数第二个元素的索引为-2# 数组元素修改
arr[2] = 6  # 将第三个元素修改为6
print("修改后的数组:", arr)# 获取数组长度
print("数组长度为:", len(arr))# 数组迭代
for i in arr:print(i)# 数组元素添加
arr.append(6)  # 在数组末尾添加一个元素
print("添加后的数组:", arr)# 数组元素插入
arr.insert(2, 7)  # 在数组第三个位置插入一个元素7
print("插入后的数组:", arr)# 数组元素删除
arr.pop()  # 删除数组末尾的一个元素
print("删除后的数组:", arr)# 数组元素查找
if 3 in arr:print("3在数组中的位置为:", arr.index(3))
else:print("数组中没有3")# 数组排序
arr.sort()
print("排序后的数组:", arr)# 数组元素反转
arr.reverse()
print("反转后的数组:", arr)

以上代码中,我们首先创建了一个数组arr,并对其进行了一系列的操作,包括元素访问、修改、迭代、添加、插入、删除、查找、排序和反转等。通过这些操作,我们可以熟练地掌握数组在 Python 中的使用方法。

🥝参考文献:

Weiss, M. A. (2014). Data structures and algorithm analysis in Java. Pearson Education.
Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to algorithms. MIT press.


🏫博客主页:魔王-T

🏯系列专栏:结构算法

🥝大鹏一日同风起 扶摇直上九万里

❤️感谢大家点赞👍收藏⭐评论✍️


相关文章:

数据结构之数组:简介、特性与应用

文章目录 🌾引言🌾数组的定义与特性🌿数组的定义🌿数组的特性🌿数组的优缺点 🌾数组的应用场景🍁数组的基本应用🍁动态数组(Dynamic Array)🍁多维…...

Hexo 还是 Hugo?Typecho 还是 Wordpress?读完这篇或许你就有答案了!

Hexo 首先介绍的是 Hexo,这也是咕咕没买服务器之前折腾的第一个博客。 演示站点:https://yirenliu.cn 用的主题是 butterfly,想当年刚用的时候,作者还没建群,现在 qq 群都有上千人了,GitHub 上的星星数量也有 2.7k 了。 优点 如果你不想买服务器,但也想折腾一个博客,…...

ChatGPT重磅升级!集简云支持GPT4 Turbo Vision, GPT4 Turbo, Dall.E 3,Whisper等最新模型

在11月7日凌晨,OpenAI全球开发者大会宣布了 GPT-4的一次大升级,推出了 GPT-4 Turbo号称为迄今为止最强的大模型。 此次GPT-4的更新和升级在多个方面显示出强大的优势和潜力。为了让集简云用户能快速体验新模型的能力,我们第一时间整理了大会发…...

Oracle 中的操作符

1.union:对两个结果集进行并集操作&#xff0c;不包括重复行&#xff0c;同时进行默认规则的排序&#xff1b; SELECT * FROM emp WHERE sal < 1500 UNION SELECT * FROM emp WHERE sal BETWEEN 1000 AND 2000 order by 1 2.union All&#xff1a;对两个结果集进行并集操…...

python之UDP网络应用程序开发

文章目录 版权声明UDP网络应用程序开发UDP初识UDP知识要点socket类的使用UDP发送数据开发流程分析UDP服务客户端通信栗子UDP广播发送 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相关权利人所有。…...

中低压MOSFET 2N7002W 60V 300mA 双N通道 SOT-323封装

2N7002W小电流双N通道MOSFET&#xff0c;电压60V电流300mA&#xff0c;采用SOT-323封装形式。超高密度电池设计&#xff0c;适用于极低的ros (on)&#xff0c;具有导通电阻和最大直流电流能力&#xff0c;ESD保护。可应用于笔记本中的电源管理&#xff0c;电池供电系统等产品应…...

kafka的设计原理

文章目录 1 Kafka简介2 Kafka的架构2.1 Kafka 一些重要概念2.2 工作流程2.3 副本原理2.4 分区和主题的关系2.5 生产者2.5.1 分区可以水平扩展2.5.2 分区策略 2.6 消费者2.6.1 消费方式2.6.2 分区分配策略 2.7 数据可靠性保证2.7.1 副本数据同步策略2.7.2 ACK 应答机制2.7.3 可靠…...

CANdelaStudio 使用教程5 编辑DID

文章目录 在哪编辑DID的分类编辑快照数据添加 DID 在哪编辑 DID的分类 编辑快照数据 添加 DID...

RESTful API 架构快速入门 Flask实现

RESTful 简介 1.1 为什么要使用 RESTful 架构&#xff1f; Representational State Transfer&#xff08;REST&#xff09;是一种面向资源的架构风格&#xff0c;广泛应用于网络服务的设计和开发。使用RESTful架构有以下几个优点&#xff1a; 简单性和可扩展性&#xff1a; RE…...

gitee仓库使用教程

下载安装git&#xff1b;在本地项目文件夹右击鼠标点击Git Bash Here;输入git init&#xff0c;这个目录变成git可以管理的仓库&#xff0c;会出现一个.git文件夹&#xff0c;如果没出现的话需要选择“显示隐藏文件”&#xff08;不会的同学自行百度一下&#xff09; 4.绑定本地…...

【ARM CoreLink 系列 3.2 -- CCI-400,CCI-500, CCI-550 差异】

文章目录 CCI-400 和 CCI-500 差异ARM CCI-400ARM CCI-500ARM CCI-550CCI-400 和 CCI-500 差异 ARM的 CCI(Cache Coherent Interconnect)系列产品是用于多核处理器之间的高性能缓存一致性互连。CCI-400 和 CCI-500 是该系列中的两种设计,它们旨在允许多个处理器核心和其他资…...

Java8 对象List 排序

目录 1.stream流式排序 1.使用说明: 2.多字段排序 2.Collections.sort(......) 排序 1.stream流式排序 Java8提供了流式操作来简化我们的编程&#xff0c;比如排序、分组、过滤、Map操作等API&#xff0c;配合Lambda表达式给我们编程带来了很大的便利&#xff0c;这篇文章重…...

【深度学习】DAMO-YOLO,阿里,701类通用检测模型,目标检测

https://github.com/tinyvision/DAMO-YOLO/blob/master/README_cn.md DAMO-YOLO是由阿里巴巴达摩院智能计算实验室TinyML团队开发的一个兼顾速度与精度的目标检测框架,其效果超越了目前的一众YOLO系列方法&#xff0c;在实现SOTA的同时&#xff0c;保持了很高的推理速度。DAMO…...

Day45:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

文章目录 300.最长递增子序列思路代码实现 674. 最长连续递增序列思路代码实现 718. 最长重复子数组思路代码实现 300.最长递增子序列 题目链接 思路 单个字符都是一个长为1的子序列&#xff0c;直接初始化dp为1。先固定一个元素位置i&#xff0c;判断0-i范围内到i的最长子序…...

浅析基于物联网的远程抄表系统的设计及应用

安科瑞 华楠 摘 要&#xff1a;本文基于物联网的概念&#xff0c;使用 ZigBee、通用分组无线服务技术两种无线通信技术相结合的方式实现远程抄表并对数据进行存储和管理。此系统设计主要分为硬件方面的设计和软件方面的设计&#xff0c;硬件方面的设计需要完成三个部分的硬件制…...

springboot(ssm付费自习室管理系统 自习室预约平台Java(codeLW)

springboot(ssm付费自习室管理系统 自习室预约平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&am…...

【Spring】Spring事务详解

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…...

跟我学c++高级篇——静态反射实现之一

一、非侵入式的静态反射&#xff08;自省&#xff09; 在前面分析过&#xff0c;反射有静态和动态两类形式&#xff0c;前者在编译期实现&#xff0c;后者在运行期实现。而针对c这类天然不支持&#xff08;或者说极弱支持&#xff09;反射的语言&#xff0c;在实现上又可以分为…...

人工智能|机器学习——循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 t…...

02_MySQL体系结构及数据文件介绍

#课程目标 了解MySQL的体系结构了解MySQL常见的日志文件及作用了解事务的控制语句&#xff0c;提交和回滚能够查看当前数据库的版本和用户了解MySQL数据库如何存放数据能在使用SQL语句创建、删除数据库 #一、MySQL的体系结构 ##1、客户端(连接者) MySQL的客户端可以是某个客户…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...