1 什么是链表?

 

数组是需要一块连续的内存,但是链表不需要,它可以通过“指针”把一串零散的内存串联起来使用,链表的常见结构有:单链表,双链表,循环单链表,循环双链表。
 
2 经典的链表应用场景有那些?
缓存技术,缓存技术在软件开发中是非常常见的,cpu 缓存,数据库缓存,浏览器缓存等等。
缓存大小有限,当缓存被用满时,那些数据应该被清理,那些数据应该保留下来?
常见的淘汰策略有三种:先进先出FIFO(First in First out),最少使用策略LFU(Least Frequently Used),最近最少使用策略(Least Recently Used)。
 
3 链表的插入\删除与查找操作?
首先说一下单链表和单循环链表的插入\删除的时间复杂度都是O(1)(这只是理论值,实际中我们要插入/删除操作,我们必须要找到这个数据),由于它的地址不是连续的,所以不同搬移数据,但是正因为这样导致了查找数据需要遍历k位才能找到第k个数据,所以查找的时间复杂度是O(n)。
再说说双向链表的删除操作,一般删除操作有两种,第一种删除等于指定值的结点的前一个结点,第二种是删除给定结点;对于第一种情况无论是哪一种都是需要O(n),第二种情况由于双向链表记录着前向和后向,所以只需要O(1)的时间复杂度。
至于插入,查找就不说了,同理可得。在实际开发中,根据实际情况使用,看是否需要额外的空间换取时间,在手机或者单片机上就需要考虑用时间换空间的设计思想。
 
4 缓存属于时间换空间还是空间换时间?
缓存实际上是利用空间换时间的设计思想,如果我们把数据存储在硬盘上,因为访问硬盘比访问内存慢非常多,从下图可以看出。但如果我们通过缓存技术,事先把数据加载到内存中,这样就可以提高每次的数据查询速度。
数据结构与算法篇 链表
 
5 链表与数组的性能对比?
很多时候一说起数组和链表第一时间想起的就是插入和查找的速度谁快O(1)和O(n)的对比,我们不能单单从时间的复杂度去分析这个问题。数组是简单易用,实际上使用的连续的内存空间,可以借助CPU的缓存机制,预读数组中的数据,使得访问效率更高。但是链表在内存当中不是连续存储,所以对CPU缓存不友好,无法有效预读。
数组无法动态扩容,需要整个数组搬移,申请更大的空间,链表天生支持动态扩容。
如果你的代码对内存的使用非常苛刻,那数组更适合你。

相关文章: