• 「学习笔记」离散化


    介绍

    离散化是应用于当结果与具体数值无关时,将较大数据按次序变为较小数据的一种算法。

    用科学的语言说,就是 把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。

    说白了就是把较大数据编成一个个较小,但是大小关系不变的数。

    也就是这样子:

    原始数据 离散化后
    12 1
    32 3
    18 2
    12 1

    有些人说:那用一个map不就行了么???

    蓝鹅 map 的常数真的大 尽量别用了,而且,这里是在讲离散化,不是map,所以我们继续看——

    过程

    离散化的过程真的很简单。一般来说只有那么3步~

    1.排序 2. 去重 3.映射

    排序 就是把数据放到另外一个数组排一遍 sort~

    去重 用unique就可以了~

    映射 修改原来数组的数据 一般用lower_bound实现 即二分找出某个元素的排名,将该元素赋为其排名即可。

    很简单吧?其实这就是STL三重奏

    代码

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define MAXN 100005
    
    int n, m;
    int a[MAXN], b[MAXN];
    
    int main(){
    	scanf( "%d", &n );
    	for ( int i = 1; i <= n; ++i ) scanf( "%d", &a[i] ), b[i] = a[i];
    	sort( b + 1, b + n + 1 );//STEP ONE
    	m = unique( b + 1, b + n + 1 ) - b - 1;//STEP TWO
    	for ( int i = 1; i <= n; ++i ) a[i] = lower_bound( b + 1, b + m + 1 ) - b;//STEP THREE
    	for ( int i = 1; i <= n; ++i ) printf( "%d%c", a[i], " 
    "[i == n] );
    	return 0;
    }
    
  • 相关阅读:
    【推广】+发送短信
    【Linux】+文件操作
    【CRT】+文件上传与下载
    【Java】+查看调用关系
    【博客园】+设置
    【Java】+http
    【Postman】
    【Java】+模拟浏览器操作
    【Java】+快速打印数组
    【Java】+字符串
  • 原文地址:https://www.cnblogs.com/louhancheng/p/10085673.html
Copyright © 2020-2023  润新知