线性数据结构之数组

数组概述

数组是一种数据结构,用于存储多个相同类型的元素。在许多编程语言中,数组是最基本的数据结构之一,常用于管理和处理数据。数组的元素在内存中是连续存储的,可以通过索引直接访问。

一、静态数组

定义:静态数组是指在编译时就确定了大小的数组,其大小在运行时不能改变。静态数组通常在栈上分配内存。

1. 特点
  • 固定大小:一旦定义,其大小就不能再更改。
  • 内存分配:通常在栈上分配,生命周期与作用域一致,使用时速度快。
  • 类型一致性:所有元素必须是相同类型,可以是基本数据类型或对象类型。
2. 优点
  • 访问速度快:可以通过索引直接访问数组中的元素,访问时间复杂度为 O(1)。
  • 内存管理简单:内存分配和释放由编译器自动管理,无需手动释放内存。
3. 缺点
  • 缺乏灵活性:无法在运行时改变数组的大小,可能导致内存浪费或溢出。
  • 插入和删除操作复杂:在数组中间插入或删除元素需要移动其他元素,时间复杂度为 O(n)。
4. 适用场景
  • 已知固定大小的数组:如存储常量、简单的数据集合(如星期几的数字表示)。
  • 性能要求高的场景:如图形处理、实时系统等。
5. 示例代码(Java)
public class StaticArrayExample {
    public static void main(String[] args) {
        // 定义一个静态数组,大小为5
        int[] staticArray = new int[5];

        // 为数组元素赋值
        staticArray[0] = 10;
        staticArray[1] = 20;
        staticArray[2] = 30;
        staticArray[3] = 40;
        staticArray[4] = 50;

        // 遍历输出数组元素
        for (int i = 0; i < staticArray.length; i++) {
            System.out.print(staticArray[i] + " "); // 输出数组元素
        }
    }
}

二、动态数组

定义:动态数组是一种可以在运行时调整大小的数组,通常在 Java 中使用 ArrayList 类来实现。动态数组允许动态增加或减少元素的数量。

1. 特点
  • 可变大小:可以根据需要动态调整大小,随时添加或删除元素。
  • 内存分配:在堆上分配内存,可能会有更高的内存管理开销。
  • 类型安全:Java 中的 ArrayList 可以使用泛型,支持类型安全。
2. 优点
  • 灵活性高:在元素数量未知或变化时,动态数组提供了更大的灵活性。
  • 插入和删除操作简单:可以直接在列表中添加或删除元素,无需手动移动元素。
3. 缺点
  • 性能开销:在动态数组扩展时,如果当前容量已满,需重新分配更大的数组并复制元素,时间复杂度为 O(n)。
  • 内存管理复杂:动态数组使用堆内存,可能导致内存泄漏,需要谨慎管理。
4. 适用场景
  • 元素数量不确定的情况:如用户输入、动态生成的数据集等。
  • 需要频繁插入和删除的场景:如实现队列、栈等数据结构。
5. 示例代码(Java)
import java.util.ArrayList;

public class DynamicArrayExample {
    public static void main(String[] args) {
        // 定义一个动态数组(ArrayList)
        ArrayList<Integer> dynamicArray = new ArrayList<>();

        // 添加元素
        dynamicArray.add(10);
        dynamicArray.add(20);
        dynamicArray.add(30);
        dynamicArray.add(40);
        dynamicArray.add(50);

        // 删除元素
        dynamicArray.remove(Integer.valueOf(20)); // 删除元素20

        // 遍历输出数组元素
        for (int item : dynamicArray) {
            System.out.print(item + " "); // 输出数组元素
        }
    }
}

三、性能分析

  1. 静态数组

    • 访问时间复杂度:O(1)
    • 插入时间复杂度:O(n)(在数组中间插入元素时)
    • 删除时间复杂度:O(n)(在数组中间删除元素时)
    • 内存使用:内存分配固定,可能会造成空间浪费。
  2. 动态数组

    • 访问时间复杂度:O(1)
    • 插入时间复杂度:O(1)(在尾部添加元素时),O(n)(扩展时)
    • 删除时间复杂度:O(n)(在数组中间删除元素时)
    • 内存使用:可能会根据元素数量动态调整,但需要在扩展时复制元素,增加了时间和空间的开销。

四、总结

  • 静态数组适用于在编译时已知大小且对性能要求较高的场合,尤其在内存管理和访问速度方面表现优异。
  • 动态数组则适用于在运行时元素数量不确定或需要频繁修改的情况,提供了更多的灵活性,但在性能和内存管理方面存在一定的开销。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ssm022房屋租售网站的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;房屋租售网站的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为…

Knife4j配置 ▎使用 ▎教程 ▎实例

knife4j简介 支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。 提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试.参数和格式都…

CSS flex布局- 最后一个元素占满剩余可用高度转载

效果图 技术要点 height父元素必须有一个设定的高度flex-grow: 1 flex 盒子模型内的该元素将会占据父容器中剩余的空间F12检查最后一行的元素&#xff0c;高度就已经改变了&#xff1b;

虚拟环境设置成kernel来解决一些jupyter报错问题

1. 下面提到的问题应该是不同环境&#xff08;base、虚拟环境&#xff09;的区别&#xff0c;而不是python版本的区别。 2. 这个方法起到了比较好的效果&#xff0c;但是底层的逻辑还没太明白&#xff0c;有时间继续研究下。 3. 最终的结果好像是pycharm、anaconda用的python…

(五)Web前端开发进阶2——AJAX

目录 1.Ajax概述 2.Axios库 3.认识URL 4.Axios常用请求方法 5.HTTP协议——请求报文/响应报文 6.前后端分离开发 7.Element组件库 1.Ajax概述 AJAX 是异步的 JavaScript和XML(Asynchronous JavaScript And XML)。简单点说&#xff0c;就是使用XMLHttpRequest 对象与服务…

揭秘PyInstaller:Python应用打包的瑞士军刀

文章目录 **揭秘PyInstaller&#xff1a;Python应用打包的瑞士军刀**1. 背景介绍&#xff1a;为何选择PyInstaller&#xff1f;2. PyInstaller究竟是什么&#xff1f;3. 如何安装PyInstaller&#xff1f;4. PyInstaller的简单使用方法4.1 打包单个Python脚本4.2 生成单个可执行…

Spring Boot 创建项目详细介绍

上篇文章简单介绍了 Spring Boot&#xff08;Spring Boot 详细简介&#xff01;&#xff09;&#xff0c;还没看到的读者&#xff0c;建议看看。 下面&#xff0c;介绍一下如何创建一个 Spring Boot 项目&#xff0c;以及自动生成的目录文件作用。 Maven 构建项目 访问 http…

机器学习——解释性AI(Explainable AI)

机器学习——解释性AI&#xff08;Explainable AI&#xff09; 解释性AI&#xff08;Explainable AI&#xff09;——让机器学习模型更加透明与可信什么是解释性AI&#xff1f;解释性AI的常见方法示例代码&#xff1a;使用SHAP解释随机森林模型示例代码&#xff1a;使用LIME解释…

开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码。 前言 在当前的物流仓储行业&#xff0c;企业面临着信息化升级的迫切需求&#xff0c;但往往受限于高昂的软件采购和维护成本。现有的…

Tomcat servlet response关于中文乱码的经验

前言 最近修改老项目项目&#xff0c;使用zuul网关返回的中文内容乱码了&#xff0c;如果使用GBK或者GB2312编码确正常显示&#xff0c;稍微实验了一下&#xff0c;发现里面很多细节&#xff0c;毕竟Springboot对我们做了很多事情&#xff0c;而且当我们使用不同的模式会出现很…

【原创分享】详述中间件的前世今生

中间件是一种软件组件&#xff0c;位于应用程序和操作系统之间&#xff0c;通过提供统一的接口和功能来简化开发和管理应用程序、提高应用程序的可靠性和性能。 中间件的前世可以追溯到20世纪80年代的分布式系统和网络技术的发展。在那个时候&#xff0c;随着计算机网络的普及…

JAVA力扣每日一题:P198. 打家劫舍

本题来自&#xff1a;力扣-每日一题 力扣 (LeetCode) 全球极客挚爱的技术成长平台https://leetcode.cn/ 题解&#xff1a; class Solution {public int rob(int[] nums) {int len nums.length;if(len 0)return 0;if(len 1)return nums[0];int first nums[0];int second …

Nuxt.js 应用中的 components:dirs 事件钩子详解

title: Nuxt.js 应用中的 components:dirs 事件钩子详解 date: 2024/10/31 updated: 2024/10/31 author: cmdragon excerpt: components:dirs 是 Nuxt.js 中的一个生命周期钩子,用于在 app:resolve 期间扩展自动导入组件的目录。通过这个钩子,开发者可以动态地添加新的组…

IDEA 好用的插件分享

IDEA 好用的插件分享 一、常用篇1. CamelCase&#xff08;大小写格式转换&#xff09;2. Translation &#xff08;翻译插件&#xff09;3. GitToolBox &#xff08;git工具箱&#xff09;4. CodeGlance Pro&#xff08;代码缩略图&#xff09;5. fittencode&#xff08;代码补…

蓝牙资讯|苹果AirPods Pro 2推出听力测试、助听器和听力保护等功能

苹果推送iOS 18.1 系统版本更新&#xff0c;AirPods Pro 2 用户也在 iOS 18.1 中获得了强大的新功能。 运行固件 7B19 的 AirPods Pro 2 用户&#xff0c;搭配 iOS 18.1 系统的 iPhone&#xff0c;将获得三项强大的听力健康功能&#xff1a;听力测试、助听器和听力保护。 听力…

计算机毕业设计Python+大模型股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; Python大模型股票预测系统 …

旺季来临,沃尔玛下了血本和亚马逊竞争,将会员年费减半至49美元

沃尔玛于10月28日宣布&#xff0c;在假日季到来之前推出Walmart Plus会员服务&#xff0c;以50%的折扣缩小与竞争对手亚马逊Prime订阅服务之间的差距。 为了吸引正在应对高通胀的消费者&#xff0c;今年沃尔玛和其他美国品牌方提前推出促销活动&#xff0c;并增加更多优惠和折…

1-位置:重新思考后处理的基于搜索的神经方法在解决大规模旅行商问题中的应用(arXiv 2024)

文章目录 Abstract1. Introduction2. Related Work2.1.监督学习2.2.无监督学习2.3.强化学习3. Preliminaries3.1. Problem Definition3.2.热图产生3.3.蒙特卡洛树搜索4. 提出的基线方法4.1. Motivation4.2. SoftDist基线方法5. 提出的度量方法5.1. 动机5.2. Score度量方法6. Ex…

[vulnhub] SecTalks:BNE0x00 - Minotaur

https://www.vulnhub.com/entry/sectalks-bne0x00-minotaur,139/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是172 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-30 15:36 CST Nmap scan…

回溯算法-Java【力扣】【算法学习day.14】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…