数据离散化是一个非常重要的思想。
为什么要离散化?
当以权值为下标的时候,有时候值太大,存不下。 所以把要离散化的每一个数组里面的数映射到另一个值小一点的数组里面去。
定义:
把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。(from百度)
简单说:离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据:1,999,100000,15;处理后:1,3,4,2;
原数据:{100,200},{20,50000},{1,400};处理后:{3,4},{2,6},{1,5};
但是离散化仅适用于只关注元素之间的大小关系而不关注元素本身的值!
操作
1、排序 :一般使用sort对数组或结构体排序
2、去重:unique()
3、索引:lower_bound()进行二分查找(lower_bound 和 二分资料:资料1 ,资料2)
相关函数用法详见小知识(随笔
#include <bits/stdc++.h>
using namespace std;
int lsh[1000],lshcopy[1000],now[1000];
int main(){
int n;cin>>n;
for(int i=0;i<n;i++){cin>>now[i];lshcopy[i]=now[i];}
sort(now,now+n);
int d=unique(now,now+n)-now;
for(int i=0;i<n;i++){
lsh[i]=lower_bound(now,now+d,lshcopy[i])-now;
cout<<lsh[i]+1<<" ";
}
/*
输入:4 1 999 100000 15
输出:1 3 4 2
*/
return 0;
}