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

文章目录

    • 🌾引言
    • 🌾数组的定义与特性
      • 🌿数组的定义
      • 🌿数组的特性
      • 🌿数组的优缺点
    • 🌾数组的应用场景
      • 🍁数组的基本应用
      • 🍁动态数组(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

🏯系列专栏:结构算法

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

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


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

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

相关文章

SQL 注入漏洞的理解

SQL 注入漏洞的理解 1. 漏洞描述 SQL注入漏洞是一种存在于Web 应用程序中的安全漏洞,它允许攻击者通过在用户中注入恶意的SQL 到吗,来操纵应用程序和数据库之间的交互,来执行未经授权的SQL命令。 2. 漏洞原理 SQL注入漏洞产生的原因主要是因为…

项目里边更换了同名的图片地址 / 图片没有及时更新 / 什么原因

一、问题分析 1.1、分析一 浏览器缓存 项目里边更换了同名的图片地址,图片没有及时更新 可能是浏览器缓存的原因,浏览器会将之前访问过的文件缓存下来,下次访问同名的文件时会先从缓存中读取。 如果相同的图片地址没有发生变化&#xff0c…

【刷题宝典NO.4】

目录 公交站间的距离 生命游戏 公交站间的距离 https://leetcode.cn/problems/distance-between-bus-stops/ 环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 …

Axios笔记

目录 一、安装Axios 二、发送请求 (一)Get请求 (二)Post请求 1. 第一种方式 2. 第二种方式 三、拦截器 (一)请求前拦截器 (二)应答拦截器 四、封装 一、安装Axios -g 全局…

程序员职场可能遇到的问题总结!

在职场中,你是否遇到过这样的领导或同事,他可能是自恋狂,自吹自擂自我标榜;可能是团队合作的绊脚石,对团队合作态度消极并频繁拖后腿;可能是抱怨专家,满满负能量;可能是完美主义者&a…

二十一、数组(6)

本章概要 数组排序Arrays.sort的使用并行排序binarySearch二分查找parallelPrefix并行前缀 数组排序 根据对象的实际类型执行比较排序。一种方法是为不同的类型编写对应的排序方法,但是这样的代码不能复用。 编程设计的一个主要目标是“将易变的元素与稳定的元素…

win11渗透武器库,囊括所有渗透工具

开箱即用,最全的武器库,且都是2023年11月最新版,后续自己还可以再添加,下载地址:https://download.csdn.net/download/weixin_59679023/88565739 服务连接 信息收集工具 端口扫描 代理抓包 漏洞扫描 指纹识别 webshel…

【C语法学习】28 - 字符测试函数

文章目录 1 isalnum()函数2 isalpha()函数3 islower()函数4 isupper()函数5 isdigit()函数6 isxdigit()函数7 iscntrl()函数8 isgraph()函数9 isspace()函数10 isblank()函数11 isprint()函数12 ispunct()函数13 tolower()函数14 toupper()函数 1 isalnum()函数 isalnum()函数…

SpringBoot——》关联映射

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

移动机器人路径规划(七)--- 基于MDP的路径规划MDP-Based Planning

目录 1 什么是MDP-Based Planning 2 worst-case analysis for nondeterministic model 3 Expected Cost Planning 4 Real Time Dynamic Programming(RTDP) 1 什么是MDP-Based Planning 之前我们从起点到终点存在很多可执行路径,我们可以…

Can‘t find libdevice directory ${CUDA_DIR}/nvvm/libdevice

win10 Running deepxde 的时候出现问题: cuda-nvcc 安装后解决了。 # Install NVCC conda install -c nvidia cuda-nvcc11.3.58 -y # Configure the XLA cuda directory mkdir -p $CONDA_PREFIX/etc/conda/activate.d printf export LD_LIBRARY_PATH$LD_LIBRARY_P…

Python实现一箭穿心

文章目录 🎄效果🏳️‍🌈Turtle模块🌹代码🌺代码讲解 🎄效果 🏳️‍🌈Turtle模块 Turtle是一个绘图工具,是Python标准库中的一个模块。它提供了一种简单而直观的方式来创…

【C++】内存管理(new与delete)

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 本篇文章我们一起来学习C的内存管理方式&…

最新yolov8环境搭建、推理训练一站式超详细教学

1、获取yolov8源码 访问yolov8_github官网,网络不稳定时可能需要加速器。yolov8源码地址 获取方式:直接下载或者git工具克隆 我使用git操作进行演示,复制github上的地址(需提前关闭加速器)。 git clone https://github.com/ultralytics/ul…

【QML】Qt设置USB免驱相机曝光时间(Linux系统)UVC

1. 问题 使用QML的Camera组件创建相机。需要配置曝光时间,使用CameraExposure中的exposureCompensation,exposureMode配置无效果,原因可能是不支持USB相机。 有两种方法经测试有效果: 命令行调用v4l2-ctl命令的方法&#xff0c…

【XSLVGL2.0】如何做全局键功能和键值映射

XSLVGL2.0 开发手册 【XSLVGL2.0】如何做全局键功能和键值映射 1、概述1、概述 项目常见需要配置一个按键,并要求短按此按键回到首页, 长按此按键进行关机。 XSLVGL2.0在输入设备对接接口中,有一个回调,在此回调中可以直接收到输入设备上报的所有按键事件。 一般这个功能…

UI自动化(selenium+python)之元素定位的三种等待方式!

前言 在UI自动化过程中,常遇到元素未找到,代码报错的情况。这种情况下,需要用等待wait。 在selenium中可以用到三种等待方式即sleep,implicitly_wait,WebDriverWait 一、固定等待(sleep) 导入time模块,设定固定的等待时间 缺…

计数问题+约瑟夫问题(map)

目录 一、计数问题 二、约瑟夫问题 一、计数问题 #include<iostream> #include<map> using namespace std; int main() {int n,x;cin>>n>>x;map<int,int>m;for(int i1;i<n;i){if(i>1 && i<10){m[i];}else{int temp i;while (…

解决github无法访问的办法

方法/步骤 1.问题描述&#xff1a;能联网但不能访问github.com 2.找到hosts文件。地址&#xff1a;C:\Windows\System32\drivers\etc &#xff08;一般是在这的&#xff09; 3.不要直接在这修改hosts文件&#xff0c;需要将hosts文件复制粘贴到桌面&#xff08;或其它地方自…

【仿写实现move函数】

仿写实现move函数 一、值的类型 1.左值 描述&#xff1a;能够取地址的值成为左值 int a 10; const int b 15; int *pa &a; const int *pb &b;2.纯右值 描述&#xff1a;赤裸裸的字面值 eg(false , 3 , 12.23等) int a 13; int *p &a; //取a的地址 int …