摘要
在具体的算法题解之前,我会先简要的描述一些知识点,这些知识点都是基于数据结构与算法专栏的总结,对于详细的推理不再涉及,仅当做笔记使用。
我们所熟识的数组
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).