离散化

离散化

使用场景&思路

当需要把一个数据范围很大,但是元素个数较少的集合映射到数组下标上时,因为计算机内存的限制,数组下标不可能完全包含这极大的数据范围,所以我们需要将其(排序后)重新顺序标号。

至于离散后数据的具体值,很多时候我们不需要关心,我们只需要知道他们之间相对的大小(这时可以排序后再离散化);如果非要知道数据的具体值,可以再开个数组,下标对应离散后的编号,里面存具体值。

实现

#include <iostream>
#include <algorithm>
#define MAXN 40000
using namespace std;
int n,a[MAXN],t[MAXN];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i],t[i]=a[i];
	sort(t+1, t+1+n);
	int len=unique(t+1, t+1+n)-(t+1);
	for(int i=1;i<=n;i++)
		a[i]=lower_bound(t+1, t+1+len, a[i])-t;//从1开始编号
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
	return 0;
}

说明

  • unique()

    去重函数 包含在头文件 algorithm

    将数组所有中重复的元素移至末尾,最终返回的是不含重复元素数组的尾地址

    所以把返回的尾地址和首地址t+1相减就是不含重复元素数组的长度len

  • lower_bound()

    查找函数 包含在头文件 algorithm

    返回第一个大于等于x的元素地址

参考

posted @ 2018-08-16 23:11  Santiego  阅读(158)  评论(0编辑  收藏  举报