数据结构和算法学习记录——总结顺序表和链表(双向带头循环链表)的优缺点、CPU高速缓存命中率

简介: 数据结构和算法学习记录——总结顺序表和链表(双向带头循环链表)的优缺点、CPU高速缓存命中率

顺序表和链表

两个结构各有优势,严格来说,他们是相辅相成的。

顺序表

优点

  1. 支持随机访问(用下标访问),需要随机访问结构支持的算法可以很好的适用。
  2. CPU高速缓存命中率较高

缺点

  1. 在头部或中部插入删除数据时,时间效率低。O(N)
  2. 是占用的连续的物理空间,空间不够时需要进行扩容。
  • 扩容有一定程度的空间消耗
  • 为了避免频繁扩容,一般我们都按倍数去扩容,用不完的这个空间就存在了空间浪费

链表(双向带头循环链表)

优点

  1. 任意位置插入删除数据都很方便,时间效率高。O(1)
  2. 可以按需申请空间。(用多少申请多少,且不会造成空间消耗)

缺点

  1. 不支持随机访问(用下标访问)。这意味着:一些排序和二分查找等在这种结构上并不适用。
  2. 链表存储一个值,同时也要存储链接指针,也有一定的消耗(很小)。
  3. CPU高速缓存命中率较低。

简单解释CPU高速缓存命中率

存储体系大类别的分,可以分为带电存储和不带电存储。

主存往上是带电存储,往下是不带电存储。


了解CPU高速缓存命中率需要多加了解的两个存储设备:三级缓存、寄存器


寄存器的速度是非常快的,而主存的速度相对来说很慢,当CPU要进行计算时,对于小的数据:会将数据从主存加载到寄存器中,计算完之后再返回内存;对于大的数据:则是会将数据加载到三级缓存中,寄存器从缓存中拿取数据进行计算,计算完再返回内存。



在访问存储数据1的内存位置 0x00123400时,会先看它是否存在于缓存中。

如果在,就直接访问;如果不在,就先加载到缓存中,再进行访问。

加载时,会加载一块连续的内存,假设一次加载20个字节(具体大小取决于硬件体系)。那顺序表的一块空间就能一次被命中到多个(即加载到多个的数据);而链表的内存空间不一定连续,可能加载的一块连续空间中命中不到链表的下一个结点。


end

目录
相关文章
|
2月前
|
存储 缓存 芯片
让星星⭐月亮告诉你,当我们在说CPU一级缓存二级缓存三级缓存的时候,我们到底在说什么?
本文介绍了CPU缓存的基本概念和作用,以及不同级别的缓存(L1、L2、L3)的特点和工作原理。CPU缓存是CPU内部的存储器,用于存储RAM中的数据和指令副本,以提高数据访问速度,减少CPU与RAM之间的速度差异。L1缓存位于处理器内部,速度最快;L2缓存容量更大,但速度稍慢;L3缓存容量最大,由所有CPU内核共享。文章还对比了DRAM和SRAM两种内存类型,解释了它们在计算机系统中的应用。
110 1
|
2月前
|
存储 编译器 C语言
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
数据结构-顺序表详解(看这篇就足够了,哈哈哈)
67 2
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
1月前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
77 3
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
2月前
|
存储 缓存 索引
从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低
本文详细对比了ArrayList和LinkedList的查询效率,从底层数据结构和CPU缓存两个方面进行分析。ArrayList基于动态数组,支持随机访问,查询时间复杂度为O(1),且CPU缓存对其友好;而LinkedList基于双向链表,需要逐个节点遍历,查询时间复杂度为O(n),且CPU缓存对其帮助不大。文章还探讨了CPU缓存对数组增删操作的影响,指出缓存主要作用于读取而非修改。通过这些分析,加深了对这两种数据结构的理解。
49 2
|
1月前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
67 0
|
2月前
|
存储
数据结构(顺序表)
数据结构(顺序表)
30 0