目录
- 离散化
- 其他
- 代码
- 参考
- 理解
参考
pecco算法笔记
理解
离散化,就是当我们只关心数据的大小关系时,用排名代替原数据进行处理的一种预处理方法。离散化本质上是一种哈希,它在保持原序列大小关系的前提下把其映射成正整数。当原数据很大或含有负数、小数时,难以表示为数组下标,一些算法和数据结构(如BIT)无法运作,这时我们就可以考虑将其离散化。
将数据的某一特征将其转化为另一种可靠的数据格式进行存储
三个工具人函数
- 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可以表示排名。
- unique(C,C+n)
- 对数组C进行整理,将前后(要先对数组C进行排序)的元素扔到后面去,并返回去重队列中的最后一个元素的下一个元素的位置,因而用其来减去C的位置,可以得到不重复队列的长度
- memcpy(C,A,sizeof(A));
- 以A的长度来将数组A赋值给数组C
- 这样我们就有一个数组来比较方便地查找排名(下标即排名),其次我们保留了原来的数组,这样可以为我们后来离散化(打标记)提供了原材料
memcpy
unique
low_bound
其他
如果说想从大到小排,请在sort和lower_bound里添加greater
代码
#includeusing 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()); 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())-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; }