离散化处理

有些数据本身很大, 自身无法作为数组的下标保存对应的属性。
如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理!
离散化:当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。
例如
91054与52143的逆序对个数相同。

那么就可以把91054表示成52143。

那么离散化如何实现呢?

用另外一个数组b,排序后再用b数组的顺序来对a数组赋值。

可以这样写:

        for(int i=1; i<=n; i++) {

           cin>> b[i].val;

           b[i].id= i;

        }

       sort(b+1, b+n+1, cmp);(对值进行排序)

        for(int i=1; i<=n; i++)  a[b[i].id]= i;

但是逆序对需要重复的数顺序也要重复

如:

1,3,3,5,6表示为1,2,2,3,5

所以要加入一个变量k记录顺序。

        for(int i=1; i<=n; i++) {

           cin>> b[i].val;

           b[i].id= i;

        }

       sort(b+1, b+n+1, cmp);(对值进行排序)

        int k=0;

        for(inti=1; i<=n; i++){

           if(i==1||b[i].val!=b[i-1].val) k++;

           a[b[i].id]= k;

        }


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值