数据结构学习_04_线性表中的顺序表和链表的区别及优缺点

什么是顺序表?
顺序表是在计算机内存中以数组的形式保存的线性表。顺序表存储是将数据元素放到一块连续的内存存储空间,相邻数据元素的存放地址也相邻,逻辑与物理的统一。
什么是链表?
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每个元素称为结点)组成,结点可以在运行时动态生成。
结点:每个结点包含两个部分:一个是存储数据元素的数据域,另一个是下一个结点地址的指针域。
优缺点比较:
1、时间上
1)访问随机元素的时间复杂度
因为顺序表的结构跟数组一样,可以用下标来访问它的元素,所以顺序表是支持随机访问的;相比单链表是链式存储的它的元素不支持随机访问,想要查找某个元素,只能从头结点开始遍历整个链表直到找到了该元素。因此顺序表访问随机元素的时间复杂度是O(1),而单链表访问随机元素的时间复杂度是O(n)
2) 随机位置插入、删除元素的时间复杂度:
因为顺序表的元素是连续存储的,因此在特定位置插入、删除元素需要把它之后的全部元素后移或者前移,时间开销很大。而单链表在插入或者删除元素的时候,只需要改变它的前驱元素的指向即可。因此顺序表在随机位置插入和删除的是时间复杂度是O(n),而单链表是O(1)。
2、空间上:
当我们不知道要存储多少数据的时候,用动态顺序表如果开辟的空间太大,就会造成一定程度上的浪费,而这时使用单链表实现时候需要几个开辟几个,虽然有非数据的指针占用空间但是相比于顺序表就可以接受。
当我们知道存储的数据的数量时,用顺序表来开辟对应的空间大小,来存储数据,因为顺序表中每个元素的存储密度为 1,就完全不会有浪费的空间,而用单链表,因为每个结点都会有非数据项得指针,那么就会造成空间的浪费。再者,编译器会为每个程序从内存上分配一段空间,给该程序使用。然而我们每次开辟空间时都是在随机的位置开辟的,那么使用单链表,就会多次的在程序分配到的这块空间上开辟空间,因为每次都是开辟的位置都是随机的,那么可能会把这块空间搞得七零八碎,出现很多小的一般使用不到的碎片空间,这样很大程度上造成了空间的浪费,而使用顺序表的话,不会经常开辟空间,这样就减少了碎片空间的出现,那么就一定程度上节省了空间
3、对CPU高速缓存的影响
因为顺序表的空间一般是连续开辟的,而且一次会开辟存储多个元素的空间,所以在使用顺序表时,可以一次把多个数据写入高速缓存,再写入主存,顺序表的CPU高速缓存效率更高,且CPU流水线也不会总是被打断;而单链表是每需要存储一个数据才开辟一次空间,所以每个数据存储时都要单独的写入高速缓存区,再写入主存,这样就造成了,单链表CPU高速缓存效率低,且CPU流水线会经常被打断

那么二者的使用场景是什么呢?
*频繁的查找却很少的插入和删除操作可以用顺序表存储,堆排序,二分查找适宜用顺序表.
*如果频繁的插入和删除操作很少的查询就可以使用链表存储
*顺序表适宜于做查找这样的静态操作;链表适宜于做插入、删除这样的动态操作。
*若线性表长度变化不大,如果事先知道线性表的大致长度,比如一年12月,一周就是星期一至星期日共七天,且其主要操作是查找,则采用顺序表;若线性表长度变化较大或根本不知道多大时,且其主要操作是插入、删除,则采用链表,这样可以不需要考虑存储空间的大小问题。
*顺序表:顺序存储,随机读取
链式:随机存储,顺序读取(必须遍历)

猜你喜欢

转载自blog.csdn.net/CZHLNN/article/details/112233705
今日推荐