摘要
在具体的算法题解之前,我会先简要的描述一些知识点,这些知识点都是基于数据结构与算法专栏的总结,对于详细的推理不再涉及,仅当做笔记使用。
我们所熟识的数组
1.1 从一个问题开始
为什么大部分编程语言中,数组要从0开始编号,而不是从1开始?
从数组存储的内存模型来看,数组的下标实际上指的是内存地址的偏移,假设用a表示数组的首地址,将数组元素的类型所占字节数计为type_size,那么a[k]表示的含义就是存储在内存空间k*typesize+base_addr处的元素,如果从1开始编号的,公式就变成了这样——
( k − 1 ) ∗ t y p e s i z e + b a s e a d d r (k-1)*typesize+base_addr (k−1)∗typesize+baseaddr
也就是说,每次随机访问数组元素时多了一个减法操作,CPU多了一次减法指令的执行。
1.2 数组概述
数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。
数组的特性之一就是数组支持随机访问,根据下标随机访问的时间复杂度是O(1).而不基于下标访问数组元素最优的方式是二分查找,平均时间复杂度为O(logn).
1.3 低效的插入与删除
由于数组使用的是连续的内存空间,所以其在插入和删除元素时实际上需要两步:
- 进行数据的搬移
- 实际的数据操作
因为涉及到元素的搬移,因此他们的平均时间复杂度是O(N),相对链表只操作指针就可以完成插入和删除来说,低效得多。
1.4 令人头疼的数组越界问题
数组在初始化时必须要指定数组的长度,但在使用时,并没有机制约束操作数组长度以外的元素,这就导致了越界问题,在java中,当处理的数组越界时,会抛出j

本文深入探讨数组、链表和栈这三种基本数据结构,分析它们的特性、优缺点以及在实际操作中的性能表现。数组支持随机访问但插入删除效率低,链表灵活但查找慢,栈则是后进先出的典型应用。通过实例和面试题集锦,帮助读者理解并掌握这些核心概念。
最低0.47元/天 解锁文章
550

被折叠的 条评论
为什么被折叠?



