数据离散化

数据得离散化是重要的算法思想。(如果每个数据元素的具体值并不重要,重要的是他们之间的大小关系的话,我们可以先对这些数据进行离散化,使数据中的最大值尽可能小且保证所有数据都是正数)

当以权值为下标的时候,有时候值太大,存不下。 所以把要离散化的每一个数组里面的数映射到另一个值小一点的数组里面去。

打个比方,某个题目告诉你有10^4个数,每个数大小不超过10^10,要你对这些数进行操作,那么肯定不能直接开10^10大小的数组,但是10^4的范围就完全没问题。

例子:原数据:1,999,100000,15;处理后:1,3,4,2

三个离散化的关键函数:

sort()的作用:排序。

unique()的作用:“去掉”容器中相邻元素的重复元素(不一定要求数组有序),它会把重复的元素添加到容器末尾(所以数组大小并没有改变),而返回值是去重之后的尾地址;

lower_bound()的作用:在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回尾后指针的地址。

 该离散化方法时间复杂度O(nlogn)

1、排序(sort)

2、去重(unique)

3、索引(lower_bound)

复制代码
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 int lsh[1000], lshcopy[1000], x[1000]; // lsh[n]是所求的离散化的数组
 6 int main()
 7 {
 8     // 输入
 9     int n;
10     cin >> n;
11     for (int i = 0; i < n; i++)
12     {
13         cin >> x[i];
14         lshcopy[i] = x[i];
15     }
16     // 离散化的三大步骤
17     sort(x, x + n);        // 第一步排序 
18     int size = unique(x, x + n) - x;   // 第二步unique函数去重 
19     for (int i = 0; i < n; i++)         // 第三步lower_bound函数索引
20     {
21         lsh[i] = lower_bound(x, x + size, lshcopy[i]) - x;// 即lsh[i]为lshcopy[i]离散化后对应的值  
22         cout << lsh[i] << " ";
23     }
24     return 0;
25 }
复制代码

记住,而且要熟练掌握(算法比赛中常用的技巧!!!)

 

posted on   Black_x  阅读(777)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示