数据结构-数组-链表

453 阅读3分钟

数组

注意:这里的数组和JavaScript中数组不一样,这里数组指的是一种数据结构,js数组是js中的一个Array对象,数据结构中的数组更加接近于C中的数组

数组是一块连续的内存空间,它由固定数量的元素组成 特点:

  • 整个数组占用的内存空间是连续的
  • 数组中元素的数量是固定的(不可增加也不可减少),创建数组时就必须指定其长度
  • 每个元素占用的内存大小是完全一样的
  • 通过下表寻找对应元素效率极高,因此遍历速度快
  • 无法添加和删除数据,虽然可以通过某种算法完成类似操作,但是会增加额外的内存开销
  • 如果数组需要的空间很大,可能一时无法找到足够大的连续空间

JavaScript中的数组 ES6之前,没有真正意义的数组,所谓Array,数组的基本特质不满足(内存空间不是连续的,数组元素数量不固定,可以增加也可以减少,并且每一个元素占用的内存空间大小并不是完全一样的),实际上底层实现是链表 ES6之后,出现真正的数组(类型化数组),但是由于只能存储数字,功能有限 目前来讲,js语言只具备不完善的数组(类型化数组)

类型化数组(具备真正数组的特点) 例如:

    var arr = new Int8Arrary(10)

数组要进行初始化,里面元素都是0 类型化数组没有push、splice等方法

但是,chrome v8引擎,对数组进行了优化,目前,js数组,基本上都是真正的数组; v8引擎 让数组的每个元素固定占用32位的空间(4个字节);

  1. 针对数字:如果数字超过32位,转换为Double对象;
  2. 针对对象:存储32位的地址;
  3. 针对字符串:封装成字符串对象;
  4. 针对布尔类型:只占用1位(0或1);

链表

为了弥补数组缺陷而出现的一种数据结构,它具备的特点

  • 每个元素出了存储数据,需要额外的内存存储一个引用(地址),来指向下一个元素
  • 每个元素占用的内存空间并不要求是连续的
  • 往往使用链表的第一个节点(根节点)来代表整个链表
  • 长度是可变的,随时可以增加和删除元素 例如: 增加数据(在内存中申请一份内存空间,如果在bc之间增加一个节点,就把b的地址指向d,d再指向c) 删除数据(删除d节点,把b指向c)
  • 插入和删除元素效率极高
  • 由于要存储下一个元素的地址,会增加额外的内存开销
  • 通过下标查询链表中的某个节点,效率会很低,所以链表的下标遍历效率很低

以上内容参考自CSDN 沐浴老哥