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

数据结构-01-数组

       每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构。

1-数组的概念和特性

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

线性表(Linear List)就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。

连续的内存空间和相同类型的数据。正是因为这两个限制,它才有了一个堪称"杀手锏"的特性:"随机访问"。a[0]就是偏移为0的位置,也就是首地址,a[k]就表示偏移k个type_size的位置,所以计算a[k]的内存地址只需要用这个公式:a[k]_address = base_address + k * type_size

查询:数组支持随机访问,根据下标随机访问的时间复杂度为O(1)。查找的时间复杂度并不为O(1)。即便是排好序的数组,你用二分查找,时间复杂度也是O(logn)。

插入:假设数组的长度为n,现在,如果我们需要将一个数据插入到数组中的第k个位置。为了把第k个位置腾出来,给新来的数据,我们需要将第k~n这部分的元素都顺序地往后挪一位。如果在数组的末尾插入元素,那就不需要移动数据了,这时的时间复杂度为O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次往后移动一位,所以最坏时间复杂度是O(n)。 因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复杂度为(1+2+…n)/n=O(n)。

删除:如果我们要删除第k个位置的数据,为了内存的连续性,也需要搬移数据,不然中间就会出现空洞,内存就不连续了。如果删除数组末尾的数据,则最好情况时间复杂度为O(1);如果删除开头的数据,则最坏情况时间复杂度为O(n);平均情况时间复杂度也为O(n)。

思想:在某些特殊场景下,我们并不一定非得追求数组中数据的连续性。如果我们将多次删除操作集中在一起执行,删除的效率会高很多;比如JVM标记清除垃圾回收算法的核心思想 就是标记一下,然后一起删除。

2-高级语言的封装

      针对数组类型,很多语言都提供了容器类,比如Java中的ArrayList;ArrayList最大的优势就是可以将很多数组操作的细节封装起来支持动态扩容

对比容器和数组优缺点:

(1)Java ArrayList无法存储基本类型,比如int、long,需要封装为Integer、Long类,而Autoboxing、Unboxing则有一定的性能消耗,所以如果特别关注性能,或者希望使用基本类型,就可以选用数组。

(2)如果数据大小事先已知,并且对数据的操作非常简单,用不到ArrayList提供的大部分方法,也可以直接使用数组。

(3)当要表示多维数组时,用数组往往会更加直观。比如Object[][] array;而用容器的话则需要这样定义:ArrayList<ArrayList > array。

       对于业务开发,直接使用容器就足够了,省时省力。毕竟损耗一丢丢性能,完全不会影响到系统整体的性能。但如果你是做一些非常底层的开发,比如开发网络框架,性能的优化需要做到极致,这个时候数组就会优于容器,成为首选

http://www.lryc.cn/news/247634.html

相关文章:

  • 甘草书店记: 2023年10月11日 星期三 晴 「做有光的人,照亮他人,也引人同行」
  • 让 OpenAI GPT4 出 10 道题测试其他开源大语言模型
  • 动态库与静态库
  • pdf文件编辑,[增删改查]
  • 如何与LEONI建立EDI连接?
  • 算法中的时间复杂度,空间复杂度
  • Python基础:推导式(Comprehensions)详解
  • 安防监控视频融合平台EasyCVR定制化页面开发
  • Roll-A-Ball 游戏
  • 医疗影像数据集—CT、X光、骨折、阿尔茨海默病MRI、肺部、肿瘤疾病等图像数据集
  • Linux僵死进程及文件操作
  • 用Python写一个浏览器集群框架
  • 【Github】git安装
  • sql语法大全
  • 小红书API接口测试 | 小红书笔记详情 API 接口测试指南
  • 实验六:Java流式编程与网络程序设计
  • 金字塔原理
  • VR全景技术助力政务服务大厅数字化,打造全新政务服务体验
  • 使用Python实现SVM来解决二分类问题
  • 合并PDF出现OOM异常
  • c语言-数据结构-链式二叉树
  • DelayQueue介绍
  • centos8 redis 6.2.6源码安装+主从哨兵
  • 机器学习之危险品车辆目标检测
  • DHCP协议及实验omnipeek抓包工具分析 IPv4协议
  • 考过了PMP,面试的时候应该怎么办?
  • 技巧-PyTorch中num_works的作用和实验测试
  • Android:FragmentTransaction
  • 5.golang字符串的拆解和拼接
  • 配置 Mantis 在 Windows 上的步骤