基础算法入门(预处理)
基础算法入门(预处理)
前言
预处理是算法中的一种优化技术,通过在实际算法执行之前对输入数据进行某些预先计算,可以提高算法的效率。预处理的目标是通过提前计算一些信息减少算法运行时的重复计算或者缩小问题的的范围来简化问题的解决方案。
预处理作用之一是将一些原本需要在算法主循环中执行的操作提前处理,从而减少算法的时间复杂度。例如在循环中需要重复计算某个值,可以先将这个值算出,避免重复。本质是通过空间换时间的方式,去存储需要多次计算的信息,来避免在循环中多次重复计算。
预处理有时可以将原始问题转化为更容易处理的形式。通过预处理,可以将问题的输入或约束转化为一种更方便的表示形式,使得算法的设计更为简单。
前缀和与差分
简介
前缀和是数组中从开头到某个位置的所有元素的和。通过预计算前缀和,我们可以在常数时间内获取数组中任意区间的和。用于高效计算数组中某个区间的和,例如解决子数组和的问题。
差分通过将相邻元素之间的差值存储在新数组中,可以实现在某个区间内的元素增减操作。用于高效更新数组中某一范围内的元素值。
学习链接
【C++算法基础】#9前缀和与差分 | 轻松学算法 | 图解ACM竞赛算法_哔哩哔哩
练习
B3612 【深进1.例1】求区间和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P9532 前缀和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P2367 语文成绩 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P4552 IncDec Sequence - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
Counting Rectangles - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
B3645 数列前缀和 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
倍增
简介
倍增用于高效计算指数幂,通过二进制分解指数来减少乘法的次数。在一些数学问题中,例如快速幂求解。
学习链接
D09 倍增算法 P3379【模板】最近公共祖先(LCA)_哔哩哔哩_bilibili
练习
P1226 【模板】快速幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P3865 【模板】ST 表 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1517 高精求小数幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
Array Cloning Technique - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
LCA - Lowest Common Ancestor - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
离散化
简介
将一组具有一定范围的数映射为连续的整数,常用于处理离散值。在一些问题中,通过离散化可以将问题转化为对连续整数的处理,方便使用一些数据结构。
学习链接
练习
B3694 数列离散化 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P4122 Blocked Billboard B - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P1496 火烧赤壁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)