版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/uestcyms/article/details/87558405
数组和字符串操作:读物
数组
数据结构的一种;又称静态数组。
简要介绍
数组内部的元素在内存中存储是有序的,一个接一个。数组的每一个元素都有一个索引,从0开始。
优势
- 快速索引:无论数组的长度如何,检索给定索引处的元素都需要时间。
- 快速添加:在数组的末尾添加元素
劣势
- 固定大小:存储数组前,需要先定义好数组的大小 (除非你使用的是动态数组)。
- 费时的插入和删除:你必须“越过”其他元素来填补或缩小差距,这需要最坏的时间。
在Python中,不存在这样简单的数组,python中多为动态数组。
JAVA示例:int gasPrices[] = new int[10]; gasPrices[0] = 346; gasPrices[1] = 360; gasPrices[2] = 354;
插入
删除
数组切片
数组切片包含了从数组中取出一个子集,重新分配内存给这个新数组并使用取出的元素进行初始化。
对于python,可以从原有列表中创建一个新的列表。
my_list[start_index:end_index] //取my_list的start_index到end_index元素形成新的数组
my_list[index]//可以通过这样的方式访问新数组
但需要特别注意,这里隐含着空间和时间的消耗,作了如下工作:
- 分配了一个新的列表
- 将源列表的元素拷贝至新列表
这里消耗的时间和空间。时间和空间的复杂度均为O(n).
所以使用数组切片的时候,睁大眼睛,谨慎使用
数组内部操作
内部操作会直接作用与输入并且会改变它,不是创建然后返回一个新的对象(引用,指针)。原始的输入会被破坏掉。
注意,内部操作并不意味着不创建任何新的变量,其实,它的意思是不会创建一个输入的拷贝。通常内部操作函数仅仅创建哪些新增的变量。
下面又两个函数:一个是内部操作,一个是外部操作
扫描二维码关注公众号,回复:
5439198 查看本文章
#内部操作
def square_list_in_place(int_list):
for index, element in enumerate(int_list):
int_list[index] *= element # NOTE: We could make this function just return, since we modify int_list in place.
return int_list
#外部操作
def square_list_out_of_place(int_list): # We allocate a new list with the length of the input
list squared_list = [None] * len(int_list)
for index, element in enumerate(int_list):
squared_list[index] = element ** 2
return squared_list
内部操作有利于节省空间,但它对周边会产生影响
外部操作有利于保证外部相关逻辑的正确性。
如果你非常在意空间且非常确定后续不会再使用原始的输入(调试也不行),此时,你可以使用内部操作。
其实就是函数传参时,是传值还是传址。
动态数组
别名有array list、growable list、resizable list、mutable list
简介
动态数组有个重大的改进:自动扩容。
优势
- 快速索引,和普通数组相同
- 可变长度,可以添加任意数量的元素。
- 缓存友好,和普通数组相同,由于其中元素都是相邻的存储,有利于缓存。
劣势
- 添加较耗时,一般情况下,向数组末尾添加元素耗时一般。但当刚好动态数组没有足够空间容纳这个元素时,它就需要进行扩容,这是就会非常耗时
- 插入和删除耗时,同普通数组相同。
大小和容量
动态数组会存储末尾索引,这样动态数组就可以追踪到末尾在哪和从哪新增元素。
双倍添加
为什么不再就的数组下面直接进行扩容,因为数组下面的内存有可能已经被其他程序所占用。
动态数组添加的时候,存在平均耗时和最差耗时,当需要扩容时,就是最差的情况,double time。
使用动态数组时也需要格外注意性能