• 离散化————实现梦想的算法


    离散化

    一、概述

    离散化是一个非常重要的思想,可以实现很多你本来无法实现的操作(本蒟蒻原因懒惰不想学习离散化,但它真的可以让你的很多想法实现);

    比如:你有10^4个数,每个数大小不超过10^10,要对这些数进行一些操作,如果开10^10的数组作为桶肯定是会爆掉的,而10^4的数组是完全ok;

    定义:离散化,是把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。(by别人的博客

    其实就是在不改变数据相对大小的条件下,将数据进行缩小。

    举个栗子:

    原数据:555555,666666,888888,222222;处理后:2,3,4,1;

    原数据:{887755,669955},{123456,456789},{654321,789456};

    处理后:{6,4},{1,2},{3,5};

     

    二、原理与操作

    1、排序

    2、去重

    3、索引

    首先我们用sort进行排序

    sort(sy+1,sy+n+1);

    然后是去重操作,为了高效,我们采用两个STL函数:unique()和lower_bound(),

    它们同属于#include<algorithm>

    #include<algorithm>//unique和lower_bound的库
    
    int size=unique(sy+1,sy+n+1)-sy;//unique显示去重后的个数
    
    lsh[i]=lower_bound(sy+1,sy+size+1,lshcopy[i])-sy;//即lsh为lshcopy离散化后对应的值

    则全体代码如下

    #include<iostream>
    #include<cstdio>
    #include<algorithm>//unique和lower_bound的库
    
    using namespace std;
    
    int lsh[1000],lshcopy[1000],sy[1000];//sy是即将被离散化的数组,lshcop是lsh的副本,lsh用于排序去重后提供离散化后的值 
    
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) {
            scanf("%d",&sy[i]);
            lshcopy[i]=sy[i];
        }
        sort(sy+1,sy+n+1);//第一步排序
        int size=unique(sy+1,sy+n+1)-sy-1;//unique显示去重后的个数
        for(int i=1;i<=n;i++) {
            lsh[i]=lower_bound(sy+1,sy+size+1,lshcopy[i])-sy;//即lsh为lshcopy离散化后对应的值 
            printf("%d ",lsh[i]);
        } 
    }

     

  • 相关阅读:
    网页跳转
    http报文简要分析
    【转】google hacking 谷歌搜索方法简介
    python中的切片问题
    Deepfakes教程及各个换脸软件下载
    PHP的虚拟域名的配置
    composer windows安装,使用新手入门[转]
    通过路由器的IP映射来解决,两个不同IP地址的PC机之间的从LAN口到WAN口的单向通讯问题
    [转] 如何把书上的字弄到电脑
    关于快排与随机化快排
  • 原文地址:https://www.cnblogs.com/fan1-happy/p/11160547.html
Copyright © 2020-2023  润新知