离散化

离散化算法详解
本文详细介绍了两种离散化算法的实现方式,一种是通过排序和查找重复元素,另一种是利用自定义比较函数进行排序离散化。文章提供了C++代码示例,展示了如何将连续数值转换为离散值,适用于数据预处理和特征工程场景。
# 第一种离散化:重复元素离散值相同
```cpp
const int maxn=1e5+10;
int a[maxn], t[maxn], b[maxn];
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
    scanf("%d",a[i]),t[i]=a[i];
sort(t+1,t+n+1);
m=unique(t+1,t+1+n)-t-1;//求出的m为不重复的元素的个数
for(int i=1; i<=n; i++)
    b[i]=lower_bound(t+1,t+1+m,a[i])-t;
//a[i]为原来的数组,b[i]为离散化后的数组
```
老是感觉,常数是不是有点大,不知是否有更优的算法  
  
补充一个(这个常数应该小一些):  
```cpp
  struct kkl{
	int v,id;
}a[MAX];
bool cam(kkl a,kkl b)
{
	return a.v<b.v;
}
void discrete()
{
	int cnt=0;
	a[0].v=-1;
	sort(a+1,a+n+1,cam);
	for(int i=1;i<=n;i++)
	{
		if(a[i].v!=a[i-1].v)	t[a[i].id]=cnt+1,cnt++;
		else	t[a[i].id]=cnt;
	}
}
```  
但是这个并不具有普适性

转载于:https://www.cnblogs.com/member-re/p/10100045.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值