当前位置: 首页 > news >正文

离散化思想

1.离散化场景

出现数据范围极大,但是数据量却不大的时候,如果我们要用数据值来映射数组下标,此时数据范围大不好直接映射,我们可以先将数据映射为一个较小的值,然后我们再用离散化后的数据处理问题。

eg:-1e9  <= x <= 1e9

此时不能直接根据x的值映射到数组中,因为x的值太大了,数组要开这么多空间是不允许的

离散化的过程:
1.升序排序数据

2.去重

升序排序并去重后我们就按照数据值的大小给原数据提供从1开始的映射值

图示:


2.模板题:

代码实现由两种:

方法一:升序排序+ 去重+二分查找

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int n;
int cnt;//记录去重后的数据个数
int a[N];//初始数据数组
int disc[N];//离散化后数据
int find(int x)
{int l = 1;int r = cnt;int mid = 0;while (l < r){mid = (l + r) / 2;if (disc[mid] < x){l = mid + 1;}elser = mid;}return l;
}
int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];disc[++cnt] = a[i];}sort(disc + 1, disc + 1 + n);//升序排序cnt = unique(disc + 1, disc + 1 + n) - (disc + 1);//去重for (int i = 1; i <= n; i++){cout << a[i] << "的离散化值为" << find(a[i]) << endl;}return 0;
}

注意:

1.unique可以对指定迭代器区间进行去重,并返回去重后的迭代器区间末尾迭代器,所以我们用unique可以完成去重,用他的返回值减去disc+1(区间开始位置迭代器)得到去重后的数据个数

2.find函数作用:利用二分查找的算法将disc数组a[i]值对应的离散化索引找到并返回

方法二:排序+哈希表

#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int N = 1e5 + 10;
int n;
int cnt;
int a[N];//初始数据数组
int disc[N];//离散化后数据
unordered_map<int, int> m;//原数据值,索引
int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];disc[++cnt] = a[i];}sort(disc + 1, disc + 1 + cnt);//升序排序int num = 0;for (int i = 1; i <= n; i++){if (m.count(disc[i])){continue;}num++;m[disc[i]] = num;}for (int i = 1; i <= n; i++){cout << a[i] << "的离散化值为" << m[a[i]] << endl;}return 0;
}

注意:

1.哈希表的key是数据值,value是离散化后的数据值

2.当数据值已经出现过在哈希表中,我们就直接跳过即可,不用重复录入

3.最后是要根据原数据值来查找的,所以我们用a[i]当key

相关文章:

  • C++初阶 | 模板
  • 黑枸杞成分对抗结肠炎:微生物组学视角下的新发现与突破
  • matlab实现高斯烟羽模型算法
  • 【C语言】通用统计数据结构及其更新函数(最值、变化量、总和、平均数、方差等)
  • ABP-Book Store Application中文讲解 - Part 8: Authors: Application Layer
  • 苹果企业签名撤销
  • powershell 查当前用户和域名
  • Python 区块链开发实战:从零到一构建智能合约
  • 【手写系列】手写动态代理
  • 软件工程专业的本科生应该具备哪些技能
  • pack 布局管理器
  • Spring 中的disposableBean介绍
  • 点云数据去噪(Point Cloud Processing Toolbox)
  • JVM 内存结构 详解
  • fastadmin fildList 动态下拉框默认选中
  • 【android bluetooth 协议分析 12】【A2DP详解 2】【开启ble扫描-蓝牙音乐卡顿分析】
  • 【知识点】第6章:组合数据类型
  • 时序替换实时?是否必要
  • C++算法训练营 Day7 哈希表及双指针
  • 《汇编语言》第14章 端口——实验14 访问CMOS RAM
  • 网站运营技巧/河南网站建设报价
  • 工商局网站怎么做身份确认/最好的网络营销软件
  • 用psd做的买书网站/竞价代运营公司
  • 做海购的网站/廊坊快速排名优化
  • 新闻网站传播力建设/企业邮箱如何申请注册
  • wordpress 5.0.2主题/怎么给网站做优化