【数据结构】顺序表和链表的区别

顺序表和链表的区别

  • 存储空间上
  • 随机访问
  • 任意位置插入或删除元素
  • 容量
  • 应用场景
  • 缓存利用率
  • 总结

存储空间上

顺序表
  顺序表的每个元素在物理空间上一定连续,最明显的特征就是顺序表是可以通过下标去访问顺序表的每个元素的

链表
  由于链表的每一个结点都是单独申请内存空间的,导致链表的每个元素只是在逻辑上连续(每个结点的next指针指向下一个结点),但在物理上它们是不连续的

随机访问

顺序表
  由于顺序表的存储结构,我们可以凭借下标直接访问顺序表中任意一个元素,时间复杂度为O(1)
链表
  因为链表特殊的存储结构,我们只能通过遍历链表的方式访问链表中某个结点的数据,时间复杂度为O(N)

任意位置插入或删除元素

顺序表
  顺序表元素的插入或删除往往需要搬移元素,且元素越多,插入或删除的元素的位置越靠前,耗费的时间就越多,时间复杂度为O(N)
链表
  链表中结点的插入或删除只需要改变指针的指向就可以做到,时间复杂度为O(1)

容量

顺序表
  动态顺序表插入时若容量不够是需要扩容的,而扩容也需要代价的

  • 内存移动:当使用 realloc 函数扩大内存块时,如果当前的内存块大小不足以容纳新的大小,realloc 函数将尝试在内存中找到一个足够大的块,然后将之前的数据复制到新的内存块中,并释放原有的内存。这个过程会涉及内存的移动操作,特别是当需要移动较大内存块时,耗费的时间会更多。
  • 时间复杂度:realloc 函数的时间复杂度取决于具体的实现。在某些情况下,如果在内存管理器的管理区域内找不到足够大的连续空闲内存块,则 realloc 函数可能需要重新分配一块更大的内存,将原有的数据复制到新的内存块中。这种情况下,realloc 的时间复杂度为 O(n),其中 n 是要重新分配的内存块的大小。但是,在其他情况下,如果存在足够大的连续空闲内存块,realloc 可能只需更新内存管理信息,时间复杂度为 O(1)。

链表
  链表中没有容量的概念

应用场景

顺序表
  元素的高效存储+频繁访问
链表
  频繁的在任意位置插入或删除

缓存利用率

存储器的层次结构
【数据结构】顺序表和链表的区别_第1张图片
  同样的数据分别存储到顺序表和链表这两个数据结构中,当CPU去访问这组数据时,效率是大不相同的
举例:
【数据结构】顺序表和链表的区别_第2张图片
这些数据都是存在内存中的,CPU不会直接去内存中访问数据,而是先看缓存中是否含有这些数据

  • 当数据在缓存中时,CPU就直接在缓存中访问数据,这个过程就叫做缓存命中
  • 当数据不在缓存中时,就叫做缓存不命中,那么系统就会将数据加载到缓存之后,CPU再进行访问

  当缓存要在内存中加载4个字节时,它不会只加载4个字节,而是加载包含这4个字节的一整段空间(因为它加载4个字节和加载十几个字节的成本是一样的),基于这样一个原因,它一般还会往后访问十几个字节(具体多少和CPU及相关硬件条件有关)
顺序表
  当在顺序表中访问第一个元素不命中时,系统就会将该数据加载到缓存,同时顺便将该元素后面的一段空间的内容也加载进去

局部性原理: CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。

  就我理解而言,就是说计算机一般认为访问了当前位置之后,极有可能访问而之前位置连续的位置。
  所以当访问第一个元素发生缓存不命中后,再次访问第二个元素、第三个元素就可以命中了
链表
由于链表的每个结点的物理地址并不连续,所以每次访问时都会出现访问不连续的现象,并且每次都会加载一堆不需要的数据,造成缓存污染

  缓存污染问题是指在缓存系统中出现了不合理或无效的缓存项,导致缓存系统无法正常工作或返回错误的结果。这种情况可能会对系统的性能、可靠性和安全性产生负面影响。
缓存污染问题通常发生在以下情况下:
  1、错误的缓存键:当使用相同的缓存键来存储不同的数据时,就会发生缓存污染。例如,在一个分布式系统中,不同的请求可能使用相同的缓存键,但期望获取不同的结果。如果这些结果被错误地缓存在相同的键下,就会导致缓存污染。
  2、无效的缓存项:当缓存中的数据失效或过期时,但仍然被缓存系统提供给客户端使用,就会导致缓存污染。这可能会导致客户端获得旧的、不正确的或过时的数据。
  3、脏数据或异常情况:在某些情况下,由于系统故障或错误处理不当,可能会将错误数据或不一致的数据写入缓存中,导致缓存污染。这种情况下,即使缓存项的键是正确的,但缓存数据仍然是无效或错误的。

总结

不同点 顺序表 链表
存储空间上 物理上一定连续 逻辑上一定连续,但物理上不一定连续
随机访问 支持O(1) 不支持:O(N)
任意位置插入或删除元素 可能需要搬移元素,效率低 O(N) 只需修改指针指向
插入 动态顺序表,空间不够是需要扩容 没有容量概念
应用场景 元素高效存频繁访问 任意位置插入和删除频繁
缓存利用率

你可能感兴趣的:(链表,数据结构)