数据离散化

很无聊 今天都没干什么
来写个离散化 加强印象

for(int i=0;i<n;i++){
    scanf("%d",&in[i]);
    temp[i]=in[i];
}
   sort(in,in+n,cmp);
   coun=unique(in,in+n)-in;
   for(int i=0;i<n;i++)
   a[i]=lower_bound(in,in+coun,temp[i])-in + 1;

代码不多 思想也很简单
主要是unique这个函数 去重 是离散化很重要的一步 有些离散化的代码没有去重 我认为是错的
比如 100 200 300 400 400 50000这组数据
没有去重的话离散出来就是 1 2 3 4 5 6
很明显 这是错的 正确的结果应该是1 2 3 4 4 5
好像我在一本正经的胡说八道啊……好夸张!
所以去重很重要 这个离散化复杂度 nlgn 好像挺高的

如果你觉得我以上我说的都是对的,那你就错了

好欠打啊
有些离散化的代码没有去重 我认为是错的
这句话 你们没发现错误吗?
事实上 有些代码是不需要去重的 就比如我上面的代码

for(int i=0; i<n; i++)
    {
        scanf("%d",&in[i]);
        temp[i]=in[i];
    }
    sort(in,in+n);
    for(int i=0; i<n; i++)
        a[i]=lower_bound(in,in+n,temp[i])-in + 1;

这个代码也是对的 为什么???
因为这个二分查找的函数!
lower_bound这个函数会返回比所求数大的最小的位置 也就决定了
即使你的数据是 100 200 300 4000 300
排序后100 200 300 300 4000
但是lower_bound这个二分查找出来的是 1 2 3 5 3 (离散化结果)、
这个结果是没有错的 只是没有4而已
所以 大家再看别人博客的时候 不要一味盲目相信 也要自己思考!!
很重要的!!尤其像我这样水平低的!!!
嘻嘻!!!!
敬上!!

你可能感兴趣的:(数据离散化)