离散化
离散化
参考
理解
离散化,就是当我们只关心数据的大小关系时,用排名代替原数据进行处理的一种预处理方法。离散化本质上是一种哈希,它在保持原序列大小关系的前提下把其映射成正整数。当原数据很大或含有负数、小数时,难以表示为数组下标,一些算法和数据结构(如BIT)无法运作,这时我们就可以考虑将其离散化。
-
将数据的某一特征将其转化为另一种可靠的数据格式进行存储
-
三个工具人函数
-
memcpy
memcpy(C,A,sizeof(A));
- 以A的长度来将数组A赋值给数组C
- 这样我们就有一个数组来比较方便地查找排名(下标即排名),其次我们保留了原来的数组,这样可以为我们后来离散化(打标记)提供了原材料
-
unique
- unique(C,C+n)
- 对数组C进行整理,将前后(要先对数组C进行排序)的元素扔到后面去,并返回去重队列中的最后一个元素的下一个元素的位置,因而用其来减去C的位置,可以得到不重复队列的长度
- unique(C,C+n)
-
low_bound
- lower_bound(C,C+L,A[I])-C+1
- 在已经排序好的C队列中去搜寻A[i],并得到A[i]或者第一个大于A[I]在C中的位置
- 因而lower_bound(C,C+L,A[I])-C+1可以表示排名。
-
其他
如果说想从大到小排,请在sort和lower_bound里添加greater<数据类型>()
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n=6;
double A[n]= {98.55,70.2,100,30,20,98.55};
double B[n+10];
int rank[n+10];
memcpy(B,A,sizeof(A));
for(int i=0;i<n;i++)
cout<<B[i]<<endl;
sort(B,B+n,greater<double>());
int len = unique(B,B+n)-B;
for(int i=0;i<sizeof(A);i++)
{
rank[i] = lower_bound(B,B+len,A[i],greater<int>())-B+1;
cout<<lower_bound(B,B+len,A[i])<<endl;
}
for(int i = 0;i<n;i++)
{
cout<<"A["<<i<<"]="<<A[i]<<" rank="<<rank[i]<<endl;
}
return 0;
}