为什么列表的下标从0开始?
内存(Memory)
什么是内存
内存(Memory)是计算机中最重要的部件之一,它是程序与CPU进行沟通的桥梁。
计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为主存,其作用是存放CPU中的运算数据,以及与硬盘等外部存储设备交换的数据。
只要计算机在运行中,CPU就会把需要运算的数据调到主存中进行运算,当运算完成后CPU再将结果传送出来,主存的运行也决定了计算机的稳定运行。
内存的物理结构
内存的内部是由各种IC电路组成的,它的种类很庞大,但是其主要分为三种存储器:随机存储器(RAM)、只读存储器(ROM)、高速缓存(Cache)
随机存储器(RAM)
内存中最重要的一种,表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的数据会丢失。
只读存储器(ROM)
ROM一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。
高速缓存(Cache)
Cache也是我们经常见到的,它分为一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)这些数据,它位于内存和CPU之间,是一个读写速度比内存更快的存储器。当CPU向内存写入数据时,这些数据也会被写入高速缓存中。
当CPU需要读取数据时,会直接从高速缓存中直接读取,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。
数据在内存上的存储
我们都知道 1字节 = 8位( 1 byte = 8 bit)
位 bit,来自英文bit,音译为“比特”,表示二进制位。
一般的,1字节的数据都会对应一个地址。
我们可以这样理解,一栋楼房(一块内存)的每一层(每一个1字节)都有楼层号(地址)
一个整型 int 占4个字节,假如,我们定义int a = 1,那么,在内存中的存储如下:
因为int 占4字节,所以把1转成二进制,即为0000 0000 0000 0000 0000 0000 0000 0001
数组存储(同一类型情况下)
数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址\(Loc (e_0)\)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,即:
故,访问指定元素时无需从头遍历,通过计算便可获得对应地址,其时间复杂度为O(1)。
假设我们要存储 Li = [1,200,900] 这样一个同一类型的数组,一个 int 类型占用4个字节,应该申请 3*4 个字节内存(连续的),
实际的存储情况应该如下:
下标也就是偏移量的意思,这也是为什么从0开始计算起
数组存储(不同类型情况下)
如果元素的大小不统一,则须采用元素外置的形式,将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息(即链接)。
由于每个链接所需的存储量相同,通过上述公式,可以计算出元素链接的存储位置,而后顺着链接找到实际存储的数据元素。
注意,图中的c不再是数据元素的大小,而是存储一个链接地址所需的存储量,这个量通常很小。
假设,我们存储Li = [1,"ab",9.00] 这样一个不同元素类型的数组,
实际的存储情况应该如下: