详解离散化

离散化

离散化是程序设计中一个常用的技巧,它可以有效的降低时间和空间复杂度。
离散化,就是把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。

好了,我们已经看了离散化是什么东西了,但是是不是还是云里雾里的不知道离散化究竟什么意思,那么离散化是何方神圣了,在我理解来看,当我们遇到这样的一种情况,我们需要用一个值来记录数组的下标的时候,假设这个数特别大就随便举一个23333333333吧,这个时候我们要开这么大的空间是不可能的,会爆炸的 ,而在实际情况,如我们要如果只用到了很小的一部分空间,而这个时候我们需要一个很大的数作为数组的下标,假如我们需要记录的下标有一下的一串:

1 3377 939449 0 47 3 37 1

这个时候我们把这些元素排序并去重过后得到:

0 1 3 37 47 3377 939449 

这个时候直接使用lower_bound函数可以查找到每一个的位置:
然后对应最初的序列的离散化过后的排列就是:

1 5 6 0 4 2 3 1

c++自带去重函数unique(a,a+n),表示在a——a+n这个范围内去重,函数将把不重复的元素放在前面,把重复的元素放在数组的后面,函数的返回值指向第一个开始重复的元素的地址,我们用它减去首地址,就得到了去重之后元素的大小了。

附上代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
		b[i]=a[i];
	}//读入元素 
	sort(b,b+n);//排序
	int m;
	m=unique(b,b+n)-b;//去重过后的元素个数
	for(int i=0;i<n;i++){
		a[i]=lower_bound(b,b+m,a[i])-b;
	}
	for(int i=0;i<n;i++){
		cout<<a[i]<<' ';
	}
	
} 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值