离散化
652 字
3 分钟
离散化
空间换时间 时间复杂度O(n log n)sort排序
算法原理
基本概念
离散化是一种数据处理思想,当遇到以下情况时使用 · 数据范围很大(如0-10^9) · 但数据总量不大(如10^5个) · 需要用数据值作为数组下标
核心思想
将原始的大范围数据映射到一个小范围的连续整数空间,保持数据间的相对大小关系。
原始数据:[9, 99, 9999, 999999]离散化后:[1, 2, 3, 4]算法实现
#include <iostream>#include <unordered_map>#include <algorithm>using namespace std;
const int N = 1e5 + 10;int n;int a[N]; // 原始数据int tmp[N]; // 用于排序的数组int cnt; // 离散化后的值计数器unordered_map<int, int> id; // 记录离散化映射关系
int main(){ cin >> n;
// 读取数据 for(int i = 1; i <= n; i++) { int x; cin >> x; a[i] = x; tmp[i] = x; // 数据放进离散化数组中 }
// 离散化处理:排序 + 建立映射 sort(tmp + 1, tmp + 1 + n);
for(int i = 1; i <= n; i++) { if(id.count(tmp[i])) continue; // 如果已经存过这个数,跳过 cnt++; // 这个数映射之后的值 id[tmp[i]] = cnt; // 建立映射关系 }
// 使用离散化后的值 for(int i = 1; i <= n; i++) { int x = a[i]; cout << x << " 离散化之后是:" << id[a[i]] << endl; }
return 0;}算法步骤详解
数据准备
· a[]:存储原始数据 · tmp[]:存储待排序的原始数据副本
排序处理
sort(tmp + 1, tmp + 1 + n);对数据进行排序,为建立映射关系做准备。
建立映射
for(int i = 1; i <= n; i++){ if(id.count(tmp[i])) continue; cnt++; id[tmp[i]] = cnt;}· 遍历排序后的数组 · 跳过重复值(保证唯一映射) · 为每个唯一值分配一个连续的整数编号
查询使用
int discrete_value = id[original_value];通过哈希表快速查询原始值对应的离散值。
注意事项
- 离散化是思想,不是固定模板:可以根据具体问题调整实现方式
- 理解映射关系: · 原始值 → 离散值:通过id[]映射 · 离散值 → 原始值:需要另外存储(如tmp[])
- 处理重复值:必须跳过重复值,保证一一映射
- 保持顺序:排序确保离散化后的大小关系不变
常见变体
- 结构体离散化:当需要同时记录其他信息时
- 二分查找离散化:不使用哈希表,用二分查找定位
- 保序离散化:确保离散化后的顺序与原始顺序一致
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
差分
算法核心思想:把「区间 [L,R] 全部元素 +k」 时间优化:O(R−L+1) 降到 O(1) 差分数组 f 是原数组 a 的相邻元素之差序列 差分数组两种构造方式
2
查并集
算法维护“集合”的三件套:查询/合并/判同
3
前缀和
算法核心思想 预处理:提前计算并储存数组的累加和,空间换时间; 查询优化:O(n)-O(1); 构建前缀和数组 原数组a[i],前缀和数组f[i]; 区间和查询 查询闭区间[l,r]的和
4
字符串哈希
算法hash(s) = \sum{i=0}^{n-1} s[i] \times p^{n-i-1} \pmod{M}
5
单调栈
算法单调栈是一种特殊的栈结构,栈中的元素保持单调递增或单调递减的顺序
随机文章随机推荐

