数组结构–数组(一)
数组的特点
- 数组是有限个相同类型的元素所组成的有序集合。
- 数组是一种线性的物理结构,存储方式为顺序存储,访问方式是随机访问。
- 利用下标查找元素的时间复杂度为 O(1) ,插入、删除元素的时间复杂度为 O(n) 。
- 数组适用于读操作多,写操作少的场景
数据的基本操作
数组的基本操作包括增、删、查、改四种基本的操作。注: 这里假设数组都是无序的
插入操作
插入可以分为尾部新增和中间插入两种情况,中间插入元素本质是将 i + 1 i+1 i+1至最后一个索引对应的元素全部向后移动一位。
不过插入元素时需要扩容。扩容,就是扩大数 i i i组的长度。当插入元素时,若发现数组长度已满,此时需要扩容数组,操作为创建一个新的同类型的数组,长度为原来的2倍,将原始数组的元素拷贝到新数组中,此时即可插入新元素。
插入实现:
def insert(lst, i, e):
"""
插入特定位置的元素
"""
length = len(lst)
if i < 0 or i > length: # 边界值处理,如果插入下标超过数组长度或者插入下标小于0,则视为插入异常,结束算法
print('插入位置超过数组长度,插入失败')
return
our_list = lst[:] # 复制原表,防止原表改变
our_list.append(our_list[-1]) # 扩大列表长度,方便插入元素
for j in range(length - 1, i, -1): # 向后移动元素
our_list[j] = our_list[j - 1]
our_list[i] = e
return our_list
测试结果:
lst = [0, 1, 2, 4, 5]
our_lst = insert(lst, 3, 3)
print('原数组:', lst)
print('插入后数组', our_lst)
#结果:
#原数组: [0, 1, 2, 4, 5]
#插入后数组 [0, 1, 2, 3, 4, 5]
查找操作
查找比较简单
查找实现:
查找特定位置元素
def find_i(lst, i):
'''
查询特定位置的元素
:param lst: 元素数组
:param i: 查询i位置的元素
:return:
'''
if i < 0 or i >= len(lst): # 边界范围处理
print('下标{}超出数组范围'.format(i))
return
for j in range(len(lst)):
if j == i:
return lst[i]
"""
上面只是做下基础演示
最简单的直接就是: return lst[i]
"""
print(find_i(our_lst, 4))
#结果:
#4
查找特定值元素
def find_value(lst, e):
'''
查询特定的值e的元素下标
:param lst: 元素数组
:param i: 查询i位置的元素
:return:
'''
if len(lst) == 0: # 边界范围处理,空表
print('数组为空,无法查到元素{}'.format(e))
return
for i in range(len(lst)):
if lst[i] == e:
return i
# 无法查到元素时处理
print('元素{}不在数组中'.format(e))
return
修改操作
def update(lst, i, e):
"""
更新特定位置i的元素为特定值e,这里在原表基础上改变,即修改原表
"""
if i < 0 or i >= len(lst): # 边界范围处理
print('下标{}超出数组范围'.format(i))
return
lst[i] = e
return lst
删除操作
移除指定索引的元素本质上是将 i + 1 i+1 i+1至最后一个索引对应的元素全部向前移动一位。
def remove(lst, i):
"""
移除特定位置i处的元素
:param lst:
:param i:
:return:
"""
length = len(lst)
if i < 0 or i >= length: # 边界范围处理
print('下标{}超出数组范围'.format(i))
return
if i == (length - 1): # 删除末尾位置的元素时直接删除
return lst[:-1]
our_lst = lst[:] # 防止原表改变
for j in range(i + 1, length):
our_lst[j - 1] = our_lst[j]
return our_lst[:-1] # 这里改变数组的长度
以上内容比较简单,这里主要是回顾一下数据结构中数组的基础知识