离散化

今天学校运动会,累了,不想写太多。。。

感谢博客http://blog.csdn.net/doyouseeman/article/details/51154142

 

正题

一、何为离散化?

有一个数组,数太大了,存不下。这时可以只储存数组中的每个数是第几大,节省大量空间和时间。

注意:数组中可能会有相同的数

比如:

7
1 10 -1 -1 0 10000 9999

离散化后是:

4 5 1 1 3 7 6

明白了的话,接着往后看。

 

二、离散化的基本方法

将数组排序,记录每个数是第几大,然后再赋值。需要开第二个数组,而且写起来很麻烦。

 

三、离散化黑科技

建议下面的代码当模板背下来就好了,看不懂没关系:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,a[1005],date[1005];

void lsh(int *x)
{
    int i;
    for(i=1;i<=n;i++) date[i]=a[i];
    sort(date+1,date+n+1);//排序是必须的 
    int r=unique(date+1,date+n+1)-date-1;//神奇的黑科技,针对date数组去重 
    for(i=1;i<=n;i++) a[i]=lower_bound(date+1,date+1+r,x[i])-date;
    //神奇的黑科技,找到a[i]在date中的位置并赋值 
}
int main()
{
    int i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    lsh(a);//对数组a进行离散化 
    for(i=1;i<=n;i++)
        printf("%d",a[i]);
    return 0;
}
离散化黑科技

嗯,讲完了。

 

~祝大家编程顺利~

posted @ 2017-09-29 21:09  白驹过隙----青春绿  Views(180)  Comments(0Edit  收藏  举报