数据结构-数组
数组的定义:
数组是一种线性表数据结构,它用一组连续的内存空间来存储一组具有相同类型的数据。
从上文中得到得得几个关键字
线性表
- 线性表*(linear list)*是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
- 线性表主要由顺序表示或链式表示。在实际应用中,常以栈、队列、字符串等特殊形式使用;顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素;链式表示指的是用一组任意的存储单元存储线性表中的数据元素。
- 均匀性:虽然不同数据表的数据元素可以是各种各样的,但对于同一线性表的各数据元素必定具有相同的数据类型和长度。
- 有序性:各数据元素在线性表中的位置只取决于它们的序号,数据元素之前的相对位置是线性的,即存在唯一的“第一个“和“最后一个”的数据元素,除了第一个和最后一个外,其它元素前面均只有一个数据元素(直接前驱)和后面均只有一个数据元素(直接后继)
连续的内存空间相同类型的数据
| A0 |
|---|
| A1 |
| B0 |
| B1 |
这句话是由线性表得均匀性和有序性决定的。
有了这两个限制,才能让数组可以随机访问。当然有利就有弊,这两个限制也让数组的很多操作变得低效,比如删除和插入操作,为了保证连续性需要做大量的数据搬移工作。相应的数组的查找速度很快。
为什么插入和删除是低效的
插入操作:
假如数组的长度为n,如果我们需要将一个数据插入到数组中的第k个位置,为了把第k个位置腾出来,需要把第k~n这部分的元素都顺序的往后挪一位,操作复杂。
如果在数组的末尾插入元素,那就不需要移动数据了,插入比较简单,单是如果在数组的头部插入元素就复杂了,需要把所有的数据都往后移动一位。
如果一个数组中的数据是有序的,那我们在某一个位置插入一个新的元素的时候就必须得按照上面的方法移动A2之后的数据,但是数组中存储的数据如果没有任何规律,这时候,如果想要把某个元素插入到k位置,为了避免大规模的数据搬移,有个简单的办法就是:直接把k位置的数据搬到数组的最后面,把新元素放到第k个位置,但有时候不能这么做因为我们需要保持数据的顺序。
删除操作:
跟插入数据类似,如果我们要删除第k个位置的数据,为了内存的连续性,也需要搬移数据,不然中间就会出现空洞。
在某些情况下,如果我们不要求数据必须是连续的,那么删除的时候可以不真删除,只是把这个元素标记为已删除,当组空间不够用的时候,在触发一次真正的删除,这样就大大减少了删除操作导致的搬移操作。