一、前言
本节主要讲解内容如下:
- 1.python序列类型
- 2.底层次数组
- 3.引用数组
- 4.python中的紧凑数组
- 5.动态数组和摊销
- 6.实现动态数组
- 7.动态数组的摊销分析
- 8.python的列表类
- 9.python的字符串类
二、python的序列类型
python的各种 ’ 序列‘ 类,即内嵌的列表类(list)、元组类(tuple)和字符串类(str)。如何你熟悉python的这些类的操作,那么我们会发现这些类之间有明显的共性,最主要的是:每个类都支持用下标访问序列元素,比如使用语法seq[k];那么这些类的公共行为和内部运作机制是什么呢?
行为
列表、字符串和元组的使用看似简单,然而在理解与这些类的相关行为上,却又一些重要的细节(比如说复制序列意味着什么,或者取序列的一部分又意味着什么。)对类的行为有误解会导致很严重的错误,所以,我们要为这些类提供一些准确的模型。这些模型会帮助我们研究更高级的用法,比如使用多维数据集合表示列表的列表。
三、底层次数组
数组:一组相关变量能够一个接一个地存储在计算机存储器的一块连续的区域内。我们将这样的表示法称之为数组。
例如,一个文本字符串是以一列有序字符的形式存储的。在python中,每个字符都用Unicode字符集表示,对于大多数计算机系统,python内部用16位表示每个Unicode字符(即2个字节)。因此,一个5个字符的字符串,比如’HELLO’,将会被存储在连续的10个字节中,如下图(图有点丑,哈哈哈)。
虽然该字符串需要12个字节的存储空间,但我们仍然把它描述为6字符数组。我们会将数组中的每个位置称为单元,并非整数索引值描述该数组,其中单元的开始编号为0、1、2等。例如,在上图中,索引为4的数组单元的内容为E,并且存储在存储器的2009和2010字节中。
注:数组的每个单元必须占据相同数量的字节。这样的好处是,使用索引值能够在常量时间内访问数组内的任一单元。例如,知道数组的起始地址2001,每个元素所占字节数2,那么’E’的内存地址是2001+2*4=2009,当然,在数组内计算内存地址的算法是自动处理的。
四、引用数组
在举一个好的例子:假设想要为某医院开发一套医疗信息系统,来记录当前分配到病床的病人的名字。假定医院有200张床,为方便起见,这些床编号为0-199。我们可以考虑使用基于数组的数据结构来记录最近分配到这些病床上病人的名字。
但是如果使用数组表示这样的列表,必须要满足数组的每个单元字节数都相同的这一条件。然而,元素是字符串,他们串的长度显然不同。python可以使用最长字符串来为每个单元预留足够的空间,但这样会比较浪费内存空间。那么,我们怎么解决这个问题呢?
python使用数组内部存储机制(即对象引用,来表示一列或者一组元素序列。在最低层,存储的是一块连续的内存地址序列,这些地址指向一组元素序列。),如下图
未完待续。。。。
参考书籍:《数据结构与算法》