- 数组即我们通常所说的表(表格),它建立的是下标和下标上对应的值之间的映射关系;
- 数组对应于物理空间中一段连续的内存空间,根据下标(或者叫索引),能以常数时间访问该位置上的值,这是链表等不连续内存空间所无法做到的;
- 一维数组最为关键的搞清楚,下标
i
的含义(一般为编号,表示相对顺序,用于索引),以及下标处的数组值
arr[i] 的含义;数组的下标范围是[0, n-1]
(n
表示元素的个数,或者数组的长度),不可能为负数,比如-1
,负数一定会出现索引失败; - 一维数组甚至可以视为关于下标的一维离散函数
比如著名的分割篱笆问题,等宽不等高的篱笆 ⇒ h[i],0≤i≤n−1
0. 数组的数学表示与数学意义
d[i]
⇒ 便可表示一个一维数组,其中
i
指代下标,
数组的数学意义在于其定义了输入(形式参数)和输出(返回值)之间的映射关系。
1. 数组与有序数组
有序数组 S 中的元素不再随机分布。当所有元素互异时,r 数组 S 的下标,也是 S 中小于 S[r] 的数目。
一般地,若小于、等于 S[r] 的元素各有 i,k 个,则该元素及其雷同元素应集中分布与 S[i, i+k)。
2. 数组即一维映射
建立数组,下标和下标处的值的映射关系;常用来 hash table 的建立,即可直接进行索引,时间复杂度为 O(1) 。
y=f(x)
- 一维数组其实与一元函数的功能很像,只不过 x 需要适配为非负整数罢了。
- 数组等线性结构(占据连续的内存空间)+ 索引,通常意味着 O(1) 的时间复杂度;
3. 数组可能的初始化方式
memset(arr, -1, sizeof(arr)); ⇒ <string/memory.h>>
- 全零,arr[i] = 0;
- 同一性映射,arr[i] = i;
4. 记录一些状态信息
- 比如当前元素的访问状态:visited = [0]*vnum; (初始化为 0,表示未被访问,访问过之后,修改为 1)
5. 普通数组与 vector 容器的区别
- 接口更为方便的
vector<bool>& visited;
将 vector 定义为全局变量,这样在接口处就很方便地定义 vector 内部区间的索引;
void foo(int lo, int hi){ ... } // cache[n][n]
6. 注意
- 数组进行访问,中括号
[]
内的索引必须是非负整数,而不可以是字符,或者负数,除非是 map 等字典结构