代码编织梦想

在这里插入图片描述

一、数组的定义

数组是一种线性表数据结构,它用一组连续的内存空间来存储一组具有相同类型的数据。

在这里,线性表的意思是,数据像一条线一样组织起来的,每个线性表上的数据只有向前和向后两个方向,比如数组、链表、队列、栈等;而非线性表就比如树、堆、图之类的。

二、数组有哪些特点?

  • 需要连续的内存空间,如果要删除或者插入一个数据,就需要做数据搬移的工作;
  • 存储相同的数据类型;
  • 随机访问,数组任意位置的地址计算为a[i]_address = base_address + i * data_type_size
  • 数组查找的时间复杂度只有在随机访问的时候才是O(1),使用二分查找时间复杂度则是O(logn);

三、数组的插入、查找、删除元素时间复杂度如何分析?

3.1、插入操作

  • 有序数组

    对于有序数组,最好和最坏情况下完成插入操作的时间复杂度分别是O(1)和O(n),那么平均下来的时间复杂度就是(1+2+3+......+n)/n=O(n)

  • 无序数组

    对于无序的数组,为了避免大规模的数据搬移工作,我们可以把原来第k位的元素搬移到最后,把需要插入到第k个位置的值插入,如此,时间复杂度将从O(n)变为O(1);

3.2、删除操作

删除操作在最好和最坏情况下的时间复杂度为O(1)和O(n),平均时间复杂度也是O(n),那有什么办法可以优化删除操作,减少搬运数据的过程,提高效率呢?

我们完全可以将多次删除操作集中在一起进行。当一开始删除时,我们可以将待删除的元素标记为已删除,等到数组已分配空间不够用的时候,触发一次清除操作和搬运数据操作。

四、数组在使用过程中需要注意什么?

在C语言中,数组越界会使得程序陷入无限死循环;

在高级语言中,比如Java,会抛出运行时异常ArrayIndexOutOfBoundsException;

建议在程序中,使用数组中元素时,都需要做越界检查,或者捕获该异常进行处理。

五、数组和容器类ArrayList的区别是什么?它们各自的优缺点是什么?

ArrayList和数组有什么区别,它们各自的优缺点是什么,以及在什么场景下使用哪个比较合适?

首先,ArrayList的底层实现就是基于数组的,但是它封装了很多数组的实现,比如插入元素和删除元素,我们直接调用add和remove即可,不用关心数据的搬移和优化等操作。

其次,ArrayList是可以自动扩容的,每次扩容都是原来的1.5倍,而数组一旦初始化好空间了,就不能更改大小,除非自己申请一块更大的连续内存空间,再手动搬运数据。ArrayList把扩容和搬运数据的操作都封装起来了,使用起来更加便捷。然而,每次扩容都涉及申请空间和搬运数据,所以,如果一开始能确定数据大小的话,就尽量就指定大小。

List<String> sl = new ArrayList<String>(100); 

然后,ArrayList的泛型只支持封装类,不支持基本数据类型,比如Integer、Long,对于如下的操作都会有自动装箱和拆箱操作,会损耗一定的性能。

List<String> sl = new ArrayList<String>(100); 
sl.add(15);
int num = sl.get(1);

还有,如果你能提前确定好数组的大小,并且代码逻辑很简单,用不着ArrayList的方法,那么就可以直接使用数组,而不是容器。如果你想要用到二维数组,也推荐使用数组,而不是容器,因为int[][]明显比ArrayList<ArrayList<>>更加的直观。

最后,对于平常的业务逻辑开发,建议使用容器类,比较简单省心,一点点的性能损耗对于整个应用来说算不得什么;但是如果你是用来写一些公共的底层方法,需要考虑很高的性能,那么就推荐使用数组。

六、数组下标为什么是从0开始的?

  • 方便寻址。比如上面说到寻址公式为a[i]_address = base_address + i * data_type_size,倘若下标从1开始,那么寻址公式就要改为a[i]_address = base_address + (i-1) * data_type_size,这样,每次数组随机访问寻址就会多一次减法操作,数组是系统中使用最为频繁的数据结构,这一点点的性能提升对整个系统来说就是很可观的。
  • 历史原因。C语言最先是这么设计的,然后其它高级语言都是基于C语言而来,所以也就继承了这一特点。但是也有例外,比如Matlab和Python。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42469135/article/details/127157873

php基础知识总结系列文章归档-爱代码爱编程

《PHP基础知识总结》系列分享专栏 《PHP基础知识总结》已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201728.html 简介 总结PHP基础知识,对初学者还是高手都值得参考巩固。 文章 PHP检查库或函数是否可用的方法关于PHP5 Session生命周期介绍PHP页面和Mysql数

java基础(三):java常用api-爱代码爱编程

本篇介绍java基础中常用API使用,当然只是简单介绍,围绕重要知识点引入,巩固开发知识,深入了解每个API的使用,查看java API文档是必不可少的。 一、java.lang包下的API Java常用基础包,在开发中会自动导入到代码环境中,不需要import。 1.基本数据类型/包装类 (1)基本数据类型:byte、short、int、lo

javase总结_肥肥的八月的博客-爱代码爱编程

亲身经历后的总结+视频老师辅导+目前工作实践 Day1-学习方法及编程思维 学习可能遇到的问题 问题: 总是感觉模糊,懵... 1.每天学习的内容都是崭新的,前面知识点,相关性不是很大!每天都是细节!内容多(10天) 2.概念:理解!细节 没思路: 1.老师的代码看的懂!基本都是抄! 2.理解不够,基本工作没有做够!【多练习,熟悉基础知识】

《php基础知识总结》系列分享专栏_hello_katty的博客-爱代码爱编程

总结PHP基础知识,对初学者还是高手都值得参考巩固。 《PHP基础知识总结》已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201728.html 文章 PHP检查库或函数是否可用的方法关于PHP5 Session生命周期介绍PHP页面和Mysql数据库的转UTF8编码问题总结WAMP5的配置问

java编程基础小总结_明影熙的博客-爱代码爱编程

郝明明的小文章 第4章 Java语言基础 Java作为一门高级的计算机编程语言,在实际工作中得到广泛使用,如:JavaWeb开发、Android应用开发、大数据开发等。本章主要涉及Java语言的基础编程知识,为大家进行其他

java --集合基础的总结-爱代码爱编程

集合的整体框架: 一、集合的框架 1. 集合、数组都是对多个数据进行存储操作的结构,简称Java容器。 说明;此时的存储,主要是指能存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)。 2.1 数组的特点: 一旦初始化以后,它的长度就确定了; 数组一旦定义好,它的数据类型也就确定了。我们就只能操作指定类型的数据了;

java继承原理内存角度_Java基础知识巩固-爱代码爱编程

最近发现自己的Java基础知识还是有点薄弱,刚好有点空闲时间进行再补一补,然后进行整理一下,方便自己以后复习。其实个人认为Java基础还是很重要的,不管从事Java后端开发还是Android开发,Java这块的基础还是重中之重,可以多去学习一下Java各种类和数据结构的写法,进行学习! 基础 正确使用 equals 方法 尽量使用 "字符串".e

java组合语法_Java中的组合语法的一个例子,有个地方不 – 手机爱问-爱代码爱编程

2004-12-18 调用fmod函数在linux系统 1。 编译指示指令C和C++的每个实现对它的主机或操作系统都支持一些独有的特征。例如,某些程序须对存放数据的存储器区域进行精确的控制,或必须控制特定函数接受参量的方式。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。 依据

Java编程思想 第四版 读书笔记巩固基础,完善知识框架。-爱代码爱编程

Java编程思想读书笔记 此笔记仅仅是作者的阅读此书时,发现自己错误认识和不牢固的知识,用来完善作者的知识框架,其列出重点不具有参考性,代码也是为了省工作量,简写代码,能看懂即可,语法并不规范 第一章 对象导论 第二章 一切都是对象 2.1 用引用操控对象 在java语言中操作内存的方式是通过“引用”,因为java中一切可以看做对象,而操作对象只

《算法和数据结构》算法零基础五十题讲解-爱代码爱编程

前言   很多人加我都是想询问如何学好算法。我的方法是我用了 十年 的时间,自己总结出来的,不可能适合所有人,但是我觉得挺有效的,如果你觉得可行,尽管一试!   首先,我们心中要有一团🔥火🔥,一团希望之🔥火🔥!只要你心中充满希望,即使是死去的意志也会在你内心复活。   你永远无法弥补你的过去,但是,你可以改变你的未来!就算暗淡无光的尘土,也会有爆发

C++学习总结-爱代码爱编程

序言 今天是2021年12月31日,也是2021年的最后一天,时间过得很快,也很慢,回想年初在江边玩耍的时候定下学习目标,仿佛就是昨天的事,细想来从定下目标的那一天至今我已完成了很多课程的学习,复盘今年,好像我走哪都只有学习的那种感觉给我留下的印象最深刻,我都怀疑如果不是学习,也许我现在根本想不起今年都去到了哪里,干了些什么。今年出了两趟远门,去了

java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之数算刷题总结_Part_5整起(树走一遭~From百一指剑)-爱代码爱编程

基础和技术就像无敌的深渊,小伙子,你要不断的学哟~~… 特此鸣谢在leetcode上分享答案的各位大神,让我能够对自己的笔记有如下补充: Part1:字符串 字符串都以字符’\0’结尾 这样咱们相当于找到这个字符就相当于找到字符串的结尾了,这也算是寻找字符串结尾的一个方法但是这个会很容易造成字符串越界,别忽略这一个字符,给人家分配初始容量时少分配

数据结构之堆_亦是远方的博客-爱代码爱编程

文章目录 一、什么是堆(一)堆的定义(二)堆的存储结构 二、怎么建立一个堆(一)AdjustDown算法(二)AdjustDown算法详解(三)算法代码(四)算法代码实例(五)AdjustDown算法复杂度分析

leetcode50天刷题计划第二季(day 8 —恢复二叉搜索树(17.30-18.40_国际知名观众的博客-爱代码爱编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、题目恢复二叉搜索树示例提示进阶 二、思路三、代码 前言 最近跟二叉搜索树杠上了、、 一、题目 恢复二

阿里开发手册-札记_妈妈炒的菜的博客-爱代码爱编程

【强制】在 subList 场景中,高度注意对父集合元素的增加或删除,均会导致子列表的遍历、增加、删 除产生 ConcurrentModificationException 异常。 说明:抽查表明,90% 的程序员对此知识点

java基础巩固-爱代码爱编程

给你一个整数数组 nums,请你将该数组升序排列。---->咱们碰到这种题目时先要搞清楚数据的特点,有的时候可能还会给具体的业务场景,在确定采用的算法之后再编码,不要一上来就手撕,闷头就是写。 首先我自己封装了一些常

深入理解计算机系统第二章家庭作业_typedef unsigned float-爱代码爱编程

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> typedef unsigned char* byte_pointer; //输入为一个字节序列的地址(

基础巩固-爱代码爱编程

点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流群 前言 深度克隆(深拷贝)一直都是初、中级前端面试中经常被问到的题目,网上介绍的实现方式也都各有千秋,大体可以概括为三种方式: JSON.stringify+JSON.parse, 这个很好理解;全量判断类型,根据类型做不同的处理2的变型,简化类型判断过程 前两种比较常见