数组

数组

  1. 定义:
    数组是一种线性表数据结构;它用一组连续的内存空间,来存储具有相同具有仙童类型的数据。
  2. 特性:
    优势:随机访问速度快,因为可以通过寻址公式来访问元素。(寻址公式:a[i]_address = base_address + i * data_type_size;下面5详解)。
    劣势:插入与删除效率比较低;因为插入删除的位置如果不是最后一个位置,都会涉及移动数据;平局时间复杂度都是O(n)。
  3. 越界问题:
    数组越界在C语言钟是一种未觉行为,并没有规定数组访问越界时编译器应该如何处理。因为,访问数组的本质就是访问一段连续内存,只要数组通过偏移计算得到的内存地址时可用的,那么程序就可能不会报任何错误。
    这种情况下就会出现,一种莫名其妙的逻辑错误。
    不过Java本身会做越界检查(真香),抛出:java.lang.ArrayIndexOutOfBoundsException
  4. 容器:
  • ArrayList最大的优势是可以将很多数组操作的细节封装起来,比如数组插入或删除时需要搬移数据的操作,另外还有一个优势就是支持动态扩容。
  • 在业务开发中,直接使用容器就可以了,省时省力,大家都是这么做,毕竟顺好一丢丢性能,完全不影响到系统整体的性能;但是如果你是做一些非常底层的开发,比如开发网络框架,性能的优化需要做到极致,这个时候数组就会优于容器。
  1. 为什么从0开始编号?
  • 寻址公式:a[i]_address = base_address + i * data_type_size
    i:索引的下标 a[i]_address:第i个数据的内存地址 base_address:数组内存的首地址 data_type_size:存储的数组大小(比如int占4个字节)

  • 如果从1开始编号的话,公式就变成:a[i]_address = base_address + (i-1) * data_type_size,对CPU来说,每次随机访问数组都多了一次减法指令,为了减少一次减法操作,所以数组就算在了从0开始编号索引下标。

一些基础问题:
实现一个支持动态扩容的数组
实现一个大小固定的有序数组,支持动态增删改操作

leetcode种一些数组相关的算法题:

 

题号难度链接个人解答
88 简单 合并两个有序数组

Leetcode88

       
posted @ 2019-09-11 11:23  vince_z  阅读(101)  评论(0编辑  收藏  举报