Title

离散化

离散化

参考

pecco算法笔记

理解

离散化,就是当我们只关心数据的大小关系时,用排名代替原数据进行处理的一种预处理方法。离散化本质上是一种哈希,它在保持原序列大小关系的前提下把其映射成正整数。当原数据很大或含有负数、小数时,难以表示为数组下标,一些算法和数据结构(如BIT)无法运作,这时我们就可以考虑将其离散化。

  • 将数据的某一特征将其转化为另一种可靠的数据格式进行存储

  • 三个工具人函数

    • memcpy

      • memcpy(C,A,sizeof(A));
      • 以A的长度来将数组A赋值给数组C
      • 这样我们就有一个数组来比较方便地查找排名(下标即排名),其次我们保留了原来的数组,这样可以为我们后来离散化(打标记)提供了原材料
    • unique

      • unique(C,C+n)
        • 对数组C进行整理,将前后(要先对数组C进行排序)的元素扔到后面去,并返回去重队列中的最后一个元素的下一个元素的位置,因而用其来减去C的位置,可以得到不重复队列的长度
    • 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;
}
posted @ 2021-05-04 00:23  BeautifulWater  阅读(428)  评论(0编辑  收藏  举报