当前位置: 首页 > 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的客户端可以是某个客户…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...