码迷,mamicode.com
首页 > 其他好文 > 详细

离散化

时间:2018-08-16 23:44:50      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:return   html   algo   efi   ref   for   int   fine   内存   

离散化

使用场景&思路

当需要把一个数据范围很大,但是元素个数较少的集合映射到数组下标上时,因为计算机内存的限制,数组下标不可能完全包含这极大的数据范围,所以我们需要将其(排序后)重新顺序标号。

至于离散后数据的具体值,很多时候我们不需要关心,我们只需要知道他们之间相对的大小(这时可以排序后再离散化);如果非要知道数据的具体值,可以再开个数组,下标对应离散后的编号,里面存具体值。

实现

#include <iostream>
#include <algorithm>
#define MAXN 40000
using namespace std;
int n,a[MAXN],t[MAXN];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i],t[i]=a[i];
    sort(t+1, t+1+n);
    int len=unique(t+1, t+1+n)-(t+1);
    for(int i=1;i<=n;i++)
        a[i]=lower_bound(t+1, t+1+len, a[i])-t;//从1开始编号
    for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    return 0;
}

说明

  • unique()

    去重函数 包含在头文件 algorithm

    将数组所有中重复的元素移至末尾,最终返回的是不含重复元素数组的尾地址

    所以把返回的尾地址和首地址t+1相减就是不含重复元素数组的长度len

  • lower_bound()

    查找函数 包含在头文件 algorithm

    返回第一个大于等于x的元素地址

参考

离散化

标签:return   html   algo   efi   ref   for   int   fine   内存   

原文地址:https://www.cnblogs.com/santiego/p/9490755.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!