数组
一、基本概念
1、什么数组?
数组是一种
线性表的数据结构。它用一组
连续的内存空间,来存储一组具有
相同类型的数据。
2、数组是如何实现下标随机访问数组元素的?
我们拿一个长度为10的数组来举例,在下面的图中,计算机给数组分配了一块连续的内存空间,其中内存的首地址为base_address=1000。
每次获取数据的时候,计算机都会根据下面的寻址公式计算出元素的存储的内存地址
a[i]_address = base_address + i * data_type_size
3、数组和链表的区别是什么?
-
数组支持随机访问,链表不可以
-
数组需要连续内存空间,链表是一组零散的内存块。
4、数组的插入操作
(1)假设数组的长度为n,现在,如果我们需要将一个数据插入到数组中的第K个位置,为了把第K个位置腾出来,给新来的数据,我们需要将第k~n的位置往后挪。
如果在数组的末尾插入元素,那就不需要移动数据,此时的时间复杂度为O(1),而如果在数组的第一个位置插入元素,那么就要移动后面的n个元素,此时的时间复杂度为o(n),因为在任何位置插入元素的概率都是一样的,所以平均时间复杂度为O((1+2+3+4+...+n)/n) = O(n+1/2) = O(n)
但是,如果我们的数组不要求有序的话,那么我们插入的时候只需要将第k个位置的元素放到最后,然后在k处插入我们的元素。此时时间复杂度为O(1)
5、数组的删除操作
如果要求数组是有序的话,那么时间复杂度和插入一样。
下面来说说数组是无序的情况下。
如果无序的时候,为避免元素移动,我们可以只将要被删除的元素删除,而不去搬移数据(比如js数组,可以置为null),当数组没有更多空间存储了,我们再去真正的删除操作,并且移动数组。
6、需要时刻警惕数组的访问越界的问题。
7、二维数组的寻址公式
对于m*n的数组:
a[i]_address = base_address + (i*n+j)*byte
8、利用链表来实现LRU缓存策略(最近最少使用策略)(使用次数是有序的)
利用一个有序数组,当有数据需要缓存的时候遍历数组
-
如果数据已经存在数组中了,则将此数据插入到数组头部,并将头部至数据原来位置的数据往后移一个位置。
-
如果数据不存在数组中,
-
如果此时缓存已满,则将数组最后一个元素删除掉,把