首页 > 其他分享 >离散化

离散化

时间:2023-11-06 19:13:48浏览次数:37  
标签:二分 映射 int 离散 数组 数据

AcWing笔记 -- 离散化


前言

所谓离散化,是将给定的有序序列通过二分查找,将其对应的值映射到其对应的序号的过程。如给定一个数组元素[5, 10, 55, 96, 1055464, 546467979],显然这是一个给定长度的有序数组。对于这样一个元素确定的有序数组,离散化之后,5映射为1也就是其序号(映射为0也可以),同理10就映射为2,546467979映射为6。这样操作过后就可以将数据范围较大的离散值映射为数据范围较小的值。

而离散化操作一般适用于这样一种场景。当题目给出的数据范围较大,且要求对一些较大的数据进行维护时,若我们提前开一个大数组的话,可能会导致MLE。但是若数据的个数并不是很多(10^6以下),我们就可以使用离散化将较大的数据映射成其数组下标(即序号,可从0开始或者1开始),从而将范围缩减,需要的数组长度就可以节省。

离散化步骤

1.数据排序与去重

由于我们要求有序的离散化,故要将数据进行排序。而且为了防止冗余的判断,我们要把数据中重复的部分去除掉。
这里使用vector来存储数据,排序加去重的代码如下

//假设存储数据的是 vector<int> A
sort(A.begin(),A.end());
A.erase(unique(A.begin(),A.end()),A.end());

其中unique函数位于algorithm库中,作用是将可迭代对象的多余重复元素都移动到对象的末尾,且返回其头部的迭代器。而erase方法可以将参数位于头尾的元素删去,这样就可以将重复元素去除掉了。

2.二分查找查找对应序号

int Find(int x)
{
	int l = -1;
	int r = A.size();
	while(l+1!=r)
	{
		int mid = l+r >> 1;
		if(A[mid] <= x)
			l = mid;
		else
			r = mid;
	}
	return l;(返回l代表从0开始编号,返回l+1代表从1开始编号)
}

这段二分模板来源可以看二分模板 不会乱的 - 凪风sama - 博客园 (cnblogs.com)
通过这段二分查找就可以查到输入x离散化后映射的值为几。

最后贴一道例题
离散化

标签:二分,映射,int,离散,数组,数据
From: https://www.cnblogs.com/CrescentWind/p/17813462.html

相关文章

  • MATLAB 使用离散数据点实现三维曲面插值
    依靠若干离散点实现三维曲面插值是工程应用中的常见问题,也是数据处理工作的常见需求。MATLAB实现上述功能主要依靠 griddata函数,该函数支持基于三角形的三次插值(仅支持内插值,估计是一种保形插值)和双调和样条插值(支持外插值)。案例数据如下图所示:案例数据空间分布如下:案例代......
  • 计算离散点的边界 MATLAB计算多维凸包
    无论是进行回归、拟合还是深度学习,总要将总体数据集划分为训练样本集和测试样本集。然而,一般情况下,测试集位于训练集“所覆盖的范围之内”时(如下图所示,红色星号表示训练样本集所在位置,蓝色圆点表示测试样本集所在位置),测试效果较好,测试结果也更具合理性。但是如何验证测试集是否在......
  • 关于离散函数的积分是否连续这件事的思考
    以前都是通过:“积分函数一定可导→可导一定连续”来记忆的后来想,0→t积分和0→t+Δt积分,当Δt→0时,如果被积函数在这里出现间断点,为啥积分还能连续?通过数形结合可以看出,积分就是微分*Δt这个小矩形块的面积,尽管微分可能够大,但是由于Δt够小,所以相当于面积为0,即积分为0,故积分函数......
  • 求解离散对数的方法:BSGS
    离散对数问题:在循环群(循环群的定义见密码协议学习笔记(1.4):密码学的一些数学基础-Isakovsky-博客园(cnblogs.com))$(\mathbb{G},\cdot)$上已知两个元素$g,h\in\mathbb{G}$,求式子$g^x=h$中$x$的值的问题,叫做离散对数问题,亦可记为$x=\log_gh$BSGS(BabyStepGiantStep......
  • 7713: 离散化去重 map
    描述 “离散化”是指把一个无穷大的集合映射到一个有限的集合中。如有n个整数,其中可能存在相同的数,现在需要你将其去重后得到的m个数用1~m来表示,同时保持原始的大小顺序不变,即在不改变数据相对大小的条件下,对数据进行相应的缩小。如:原数据:1,999,100000,15处理后:1,3,4......
  • 基于凸多边形离散点排序的研究
    OrderBy(){varvertices1=_.cloneDeep(this.polygon);varxArray=vertices1.map((item)=>item.x);varyArray=vertices1.map((item)=>item.y);const[minX,maxX,minY,maxY]=[_.min(xArray),_.max(xArray),_.min(yArray),_.m......
  • FAST角点检测离散圆形扫描
    FAST角点检测离散圆形扫描目的是扫描离散圆内所有点,计算灰度质心,过程为小半径到大半径极坐标形式扫描,最终如下,对圆内所有坐标进行扫描代码:clcclearallcloseall%%初始化参数%正方形绘图边长Side=11;%当前扫描坐标current=zeros(1,2);%上次坐标last=zero......
  • 离散数学
    数理逻辑分为命题逻辑和谓词逻辑两部分命题逻辑命题的真值只有两个:“真”或者“假”命题的表示:用大写字母表示逻辑连接词复合命题由若干个连结词、标点符号及原子命题复合构成的命题非$\neg$合取$\land$表示:并且、不但而且定义:两个命题P和Q的合取是一个复合命题,记作......
  • ​​pandas.get_dummies()​​ 是一个用于执行独热编码(One-Hot Encoding)的 pandas 函
    pandas.get_dummies()是一个用于执行独热编码(One-HotEncoding)的pandas函数。它用于将分类(或离散)特征转换为模型可以处理的二进制格式,以便更好地在机器学习算法中使用。独热编码将每个不同的类别值转换为一个新的二进制特征列,其中每个列代表一个类别,并且只有一个值为1,其余为0......
  • 基础算法:离散化实现
    1、离散化值域大而数值稀疏的题目,通常先将需要操作的数映射到一个数组中,再做后续操作,可以大大减少时间复杂度。以AcWing.802为例,是一个典型的前缀和问题,但问题在于,若仅仅使用前缀和算法,时间复杂度会很高,因此需要先做离散化映射。题目要求如下:假定有一个无限长的数轴,数轴上每个......