Loading

算法之美-05-数组

线性表-数组

引入的一个问题:数组为什么要从0开始编号,而不是从1开始?

答案:下标可以理解为偏移。计算地址的时候可以少一次减法运算。C语言设计者是这样想的,后面就延续下去了。

a[k]_address = base_address + k * type_size
a[k]_address = base_address + (k-1) * type_size

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

引申的概念:
包含关系=>
线性表:数组、链表、队列、栈。线性表的概念:线性表上的数据最多只有前和后两个方向。
非线性表:二叉树、树、堆。

优点:连续的内存空间+相同类型的数据:适合查找,根据下标查找的空间复杂度是O(1)。
缺点:低效的插入和删除。为了保证连续的内存空间,在插入和删除的时候,需要对部分连续的数据进行移动。

什么是容器:语言对数组的一种封装。例如在Java中的ArrayList。

  • 对数组的操作细节进行封装
  • 支持动态扩容(存储空间不够时,自动扩容1.5倍)
    tips:
  • 对于 ArrayList,事先指定数据的大小,可以省掉很多次内存申请和数据搬移操作。
  • 容器无法存储基本类型,比如 int、long,需要封装为Integer、Long类,所以需要装箱和拆箱,会有性能的损耗。如果在使用基本类型的时候,又比较关注性能,可以使用数组。
  • 多维数组,使用数组更加直观。
posted @ 2025-03-12 22:15  一起滚月球  阅读(15)  评论(0)    收藏  举报