注: 此内容学习须有一定编程的基础,本专题将尽可能详细去讲解数据结构与算法的知识。 该内容所有算法均可适用,作者主要使用的python语言。
图片内容若已理解,可跳过下方文字部分。
数据结构分为线性结构和非线性结构。 其中线性结构包括: 数组、队列、链表和栈。 非线性结构包括: 树和图。
数组知识一般被容易被忽视,以至于在后面一些较难的操作中,常常让人无从下手。 这篇文章,我将详细 介绍数组的知识(其中之一) 。
我们知道数组的存储方式是线性的,线性即一个挨着一个进行存储的。 这样的结构创建以及查询相较于非线性结构会较为简单,但是在一些其他的操作中,时间复杂度和空间复杂度就会比较高。 为什么会导致这样的情况呢?
这就需要讲到我们今天的知识点——数组的内存存储。
数组的存储是这样的: 数组有下标,当我们在一个位置中存储一个数值,其实数组中并没有真实存储这个数值,而是存储了这个下标,下标进一步指向存储地址,而在这个存储地址之中,存储着我们的数值。 (详见上方图片)
案例分析:
- 我们假设,要开辟一块空间,这个空间范围为4,假设这块空间的内存地址就是1000-1003。
- 我们建立一个数组A,A=[0,2,5,3]
- A[0]=0,A[1]=2,A[2]=5,A[3]=3
- A的下标0,即指向1000,而在电脑1000这个内存位置上存储的是0。A的下标1,即指向1001,而在电脑1001这个内存位置上存储的是2。A的下标2,即指向1002,而在电脑1002这个内存位置上存储的是5。A的下标3,即指向1003,而在电脑1003这个内存位置上存储的是3。
- 这个过程其实就是寻址公式的推导:
a[i]_address = base_address + i * data_type_size
我们也由此发现正是由于数据结构的小标是从0开始的,才可以使得小标的第一个值指向地址的第一个数。如果小标按照我们人类尝试从0开始,那么将增加计算机运行的复杂程度。