数组与链表

本文探讨了数组和链表两种数据结构的特点。数组支持随机访问但需要连续内存,链表则是零散内存块。内容涉及在数组中插入数据、缓存管理、链表节点的删除和特定条件下的插入操作,以及代码在不同链表长度情况下的正确性检查。
摘要由CSDN通过智能技术生成
数组
一、基本概念
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缓存策略(最近最少使用策略)(使用次数是有序的)
利用一个有序数组,当有数据需要缓存的时候遍历数组
  1. 如果数据已经存在数组中了,则将此数据插入到数组头部,并将头部至数据原来位置的数据往后移一个位置。
  2. 如果数据不存在数组中,
  • 如果此时缓存已满,则将数组最后一个元素删除掉,把
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值