-
占用内存少、缓存局部性好 占用内存多 优势操作 随机访问 插入、删除 � 缓存局部性的简单解释 在计算机中,数据读写速度排序是“硬盘 < 内存 < CPU 缓存”。当我们访问数组元素时,计算 机不仅会加载它,还会缓存其周围的其它数据,从而借助高速缓存来提升后续操作的执行速度。 链表则不然,计算机只能挨个地缓存各个结点,这样的多次“搬运”降低了整体效率。 ‧ 下表对比了数组与链表的各种操作效率。 然,堆排序一 般无需弹出元素,仅需每轮将堆顶元素交换至数组尾部并减小堆的长度即可。 ‧ 获取最大的 ? 个元素。这既是一道经典算法题目,也是一种常见应用,例如选取热度前 10 的新闻作为 微博热搜,选取前 10 销量的商品等。 8.2. 建堆操作 * 如果我们想要根据输入列表来生成一个堆,这样的操作被称为「建堆」。 8.2.1. 两种建堆方法 借助入堆方法实现 最直接地,考虑借助「 出现最差情况的概率很低:虽然快速排序的最差时间复杂度为 ?(?2) ,不如归并排序,但绝大部分情况 下,快速排序可以达到 ?(? log ?) 的复杂度。 ‧ 缓存使用效率高:哨兵划分操作时,将整个子数组加载入缓存中,访问元素效率很高。而诸如「堆排序」 需要跳跃式访问元素,因此不具有此特性。 ‧ 复杂度的常数系数低:在提及的三种算法中,快速排序的 比较、赋值、交换 三种操作的总体数量最少 (类似于「插入排序」快于「冒泡排序」的原因)。
0 码力 |
186 页 |
14.71 MB
| 1 年前 3
-
优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。 经常访问的数据和指令,以提高程序运行效率。三者共同协作,确保计算机系统高效运行。 如图 4‑10 所示,在程序运行时,数据会从硬盘中被读取到内存中,供 CPU 计算使用。缓存可以看作 CPU 的 一部分,它通过智能地从内存加载数据,给 CPU 提供高速的数据读取,从而显著提升程序的执行效率,减少 对较慢的内存的依赖。 图 4‑10 硬盘、内存和缓存之间的数据流通 4.4.2 数据结构的内存效率 在内存空间利用方面,数组和链表各自具有优势和局限性。 不得不从速度较慢的内存中加载所需数据。 显然,“缓存未命中”越少,CPU 读写数据的效率就越高,程序性能也就越好。我们将 CPU 从缓存中成功获 取数据的比例称为缓存命中率(cache hit rate),这个指标通常用来衡量缓存效率。 为了尽可能达到更高的效率,缓存会采取以下数据加载机制。 第 4 章 数组与链表 hello‑algo.com 86 ‧ 缓存行:缓存不是单个字节地存储与加载数据,而是
0 码力 |
383 页 |
18.49 MB
| 1 年前 3
-
优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。 经常访问的数据和指令,以提高程序运行效率。三者共同协作,确保计算机系统高效运行。 如图 4‑10 所示,在程序运行时,数据会从硬盘中被读取到内存中,供 CPU 计算使用。缓存可以看作 CPU 的 一部分,它通过智能地从内存加载数据,给 CPU 提供高速的数据读取,从而显著提升程序的执行效率,减少 对较慢的内存的依赖。 图 4‑10 硬盘、内存和缓存之间的数据流通 4.4.2 数据结构的内存效率 在内存空间利用方面,数组和链表各自具有优势和局限性。 不得不从速度较慢的内存中加载所需数据。 显然,“缓存未命中”越少,CPU 读写数据的效率就越高,程序性能也就越好。我们将 CPU 从缓存中成功获 取数据的比例称为缓存命中率(cache hit rate),这个指标通常用来衡量缓存效率。 为了尽可能达到更高的效率,缓存会采取以下数据加载机制。 第 4 章 数组与链表 www.hello‑algo.com 86 ‧ 缓存行:缓存不是单个字节地存储与加载数据,
0 码力 |
383 页 |
18.49 MB
| 10 月前 3
-
优化数据结构的操作效率。 ‧ 空间效率高: 数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问: 数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性: 当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下缺点。 ‧ 插入与删除效率低: 当数组中元素较多时,插入与删除操作需要移动大量的元素。 数 据。然而,我们通常会使用一种更优雅的方式实现堆排序,详见后续的堆排序章节。 ‧ 获取最大的 ? 个元素:这是一个经典的算法问题,同时也是一种典型应用,例如选择热度前 10 的新闻 作为微博热搜,选取销量前 10 的商品等。 8.2 建堆操作 在某些情况下,我们希望使用一个列表的所有元素来构建一个堆,这个过程被称为“建堆操作”。 8.2.1 自上而下构建 我们首先创建一个空堆,然后 出现最差情况的概率很低:虽然快速排序的最差时间复杂度为 ?(?2) ,没有归并排序稳定,但在绝大 多数情况下,快速排序能在 ?(? log ?) 的时间复杂度下运行。 ‧ 缓存使用效率高:在执行哨兵划分操作时,系统可将整个子数组加载到缓存,因此访问元素的效率较 高。而像“堆排序”这类算法需要跳跃式访问元素,从而缺乏这一特性。 ‧ 复杂度的常数系数低:在上述三种算法中,快速排序的比较、赋值、交换等操作的总数量最少。这与 “
0 码力 |
378 页 |
30.70 MB
| 1 年前 3
-
Loading...