【算法】什么是离散化

news2024/9/22 9:34:53

作者:指针不指南吗
专栏:算法篇

🐾人类做题的过程,就是个暴搜的过程🐾

文章目录

  • 1.引入
  • 2.思路
  • 3.模板题

1.引入

特指有序、整数的离散化。

离散化,本质上是一种哈希,它在保持原序列大小关系的前提下把其映射成正整数。它可以有效的降低时间复杂度。离散化可以改进一个低效的算法,甚至实现根本不可能实现的算法。

原数据很大或含有负数、小数时,难以表示为数组下标,一些算法和数据结构无法运作,这时我们就考虑将其离散化。

基本思想就是在众多可能的情况中,只考虑需要用的值,比如给你 1 0 9 10^9 109个数,但你只用到 1 0 5 10^5 105 个数,这时候就可以使用离散化,把这 1 0 5 10^5 105 个数映射成从0开始的自然数,即数组下标(把稀疏的数据变的稠密起来)。

2.思路

思路是:先排序,再删除重复元素,最后就是索引元素离散化后对应的值。

模板如下

vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());   // 去掉重复元素

// 二分求出x对应的离散化的值
int find(int x) // 找到第一个大于等于x的位置
{
    int l = 0, r = alls.size() - 1;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (alls[mid] >= x) r = mid;
        else l = mid + 1;
    }
    return r + 1; // 映射到1, 2, ...n
}

离散化可以用STL较简单地完成。

unique 的作用是“去掉”容器中相邻元素的重复元素,这里所说的“去掉”并不是真正把重复元素删除,它实质上是一个伪去除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后返回去重后最后一个元素的地址。
因为unique去除的是相邻元素的重复元素,所以使用之前需要排序。

注意:① a中可能有重复元素,需要去重(erase,unique)
② 算出a[i]离散化后的值,需要使用二分思想
③离散化的本质,是映射,将间隔很大的点,映射到相邻的数组元素中。减少对空间的需求,也减少计算量

3.模板题

题目 802. 区间和 - AcWing题库

在这里插入图片描述

分析过程

转载链接: AcWing 802. 画个图辅助理解~ - AcWing 8021.png

8022.png

代码实现

#include<bits/stdc++.h>
using namespace std;

const int N=3*1e5+10;

typedef pair<int,int> PII;

int n,m;
int a[N]; //存的数
int s[N]; //前缀和

//离散化数组
vector<int> alls;
// add存所有插入操作,query存所有查询操作
// 因为要在离散化之后再处理这些操作,所以它们都要记录下来
vector<PII> add,query;

int find(int x) //求离散化之后的值
{
    int l=0,r=alls.size()-1;
    while(l<r)
    {
        int mid=l+r>>1;
        if(alls[mid]>=x) r=mid;
        else l=mid+1;
    }
    return r+1; //映射的结果是1,2,3...,因为用到前缀和
}

int main()
{
    cin>>n>>m;
    
    for(int i=0;i<n;i++)
    {
       int x,c;
       cin>>x>>c;
       add.push_back({x,c}); //读入所有的操作
       
       alls.push_back(x); 
    }
    
    for(int i=0;i<m;i++)
    {
        int l,r;
        cin>>l>>r;
        query.push_back({l,r});
        
        alls.push_back(l);
        alls.push_back(r); //把所有需要用到的下标放到alls里面去
    }
    
    //去重
    sort(alls.begin(),alls.end());  //按照有序,从小到大
    alls.erase(unique(alls.begin(),alls.end()),alls.end());
    
    //处理加数
    for(auto item : add)
    {
        int x=find(item.first);  //这里可以直接使用 离散化之后的值,因为有序
        a[x]+=item.second;
    }
    
    //预处理前缀和
    for(int i=1;i<=alls.size();i++)
        s[i]=s[i-1]+a[i];
        
    //处理询问
    for(auto item:query)
    {
        int l=find(item.first),r=find(item.second);
        cout<<s[r]-s[l-1]<<endl;
    }
    
    return 0;
}

Alt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

肝一肝设计模式【六】-- 装饰器模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 文章目录 系列文章目录前言一、什么是装饰器模…

PLSQL Developer远程连接Oracle报错提示:“ORA-12541:TNS:无监听程序”的解决方案及思路

环境&#xff1a; 1、Windows Server 2、远程Oracle数据库&#xff1a;Oracle11g R2 3、PL/SQL程序&#xff1a;PL/SQL Developer Version 11.0.5.1790 (64 bit) 一、思路拆解&#xff1a; 此现象一般定位到远端的监听服务来找问题&#xff0c;在远端查看监听服务状态&#x…

DolphinScheduler 3.1.4详细教程

文章目录 第一章 DolphinScheduler介绍1.1 关于DolphinScheduler1.2 特性1.3 名词解释1.3.1 名词解释1.3.2 模块介绍 第二章 DolphinScheduler系统架构2.1 系统架构图2.2 架构说明该服务包含&#xff1a; 2.3 启动流程活动图2.4 架构设计思想2.4.1 去中心化vs中心化2.4.1.1 中心…

制作帮助中心过程中常见的误区与解决方法?

制作帮助中心是为了帮助用户了解产品和解决问题的重要手段。然而&#xff0c;在制作的过程中&#xff0c;我们可能会遇到一些误区&#xff0c;这些误区可能会导致我们的帮助中心无法达到预期的效果。因此&#xff0c;在本文中&#xff0c;我们将探讨制作帮助中心过程中常见的误…

今年产品经理这么卷,大家怎么面试的呢?

随着互联网行业的快速发展&#xff0c;产品经理这个职位变得越来越重要。产品经理需要具备多方面的能力&#xff0c;如市场调研、用户需求分析、产品设计、项目管理等等。因此&#xff0c;对于企业来说&#xff0c;招聘一名合适的产品经理是非常关键的。 而对于求职者来说&…

中国奇人周兴和——记四川星河建材有限公司董事长周兴和(中)

经商送礼 关押收审 从10多岁就开始闯荡社会的周兴和&#xff0c;可以说是社会大熔炉锻炼出来的奇人。他仅有小学文化程度&#xff0c;但是他的社会经验和社会知识却相当丰富&#xff0c;可以称得上是一个“社会学专家”。他口才超常&#xff0c;其处事能力、应变能力和综合能力…

ASEMI代理ADUM1250ARZ-RL7原装ADI车规级ADUM1250ARZ-RL7

编辑&#xff1a;ll ASEMI代理ADUM1250ARZ-RL7原装ADI车规级ADUM1250ARZ-RL7 型号&#xff1a;ADUM1250ARZ-RL7 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;SOIC-8-150mil 批号&#xff1a;2023 引脚数量&#xff1a;8 工作温度&#xff1a;-40C~105C 安装类型&#…

4.7亿加元!爱立信和加拿大政府巨额投资量子计算

​ &#xff08;图片来源&#xff1a;网络&#xff09; 爱立信与加拿大政府的研发合作为期五年&#xff0c;项目价值超过4.7亿加元&#xff08;约合23.9亿元人民币&#xff09;&#xff0c;主要投入在爱立信位于安大略省渥太华和魁北克省蒙特利尔的工厂。预计将创造数百个工作…

三十岁成功入职京东啦!

我是小九小九不爱喝酒&#xff1a; 自己工作5年后&#xff0c;我成功拿到了京东的offer。下面说下我是如何从传统行业到京东的经历&#xff0c;希望能对你有所帮助。 本科我学的是机械电子工程专业&#xff0c;2013年本科毕业后&#xff0c;同学们大多到各研究所从事智能机器人…

真题详解(归纳法)-软件设计(六十七)

真题详解(关系模型)-软件设计&#xff08;六十六)https://blog.csdn.net/ke1ying/article/details/130495791 1、2018上半年 将小阶向大阶对奇&#xff0c;尾数右移动 解析&#xff1a; 0.23 * 10的2次方 0.22 *10的3次方 第一步&#xff1a;0.023*10的3次方&#xff0c;…

2022年收入增长23%,23年Q1大涨85%,上市后英方软件交出了一份亮眼的答卷

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 2023年4月26日&#xff0c;英方软件&#xff08;688435&#xff09;公布了上市后首个业绩报告&#xff0c;包括2022年度财报和2023年第一季度财报。披露财报显示&#xff0c;英方软件在2022年实现营业收入1.97亿元&#xff…

ZC706P试验PL_DDR3内存条的步骤方法

ZC706P 板卡完全兼容XILINX官方的ZC706,当然也支持PL外挂的1G的DDR3内存条&#xff0c;这个片BLOG我提供从官方下载的一个文档和一个项目&#xff0c;演示一下验证DDR3的步骤。 步骤1&#xff1a;准备好板子&#xff0c;安装好软件。 链接&#xff1a;https://pan.baidu.com/s…

《创造》人生旅程

上个月读完的这本《创造》&#xff0c;发现作者是iPod的创造者&#xff0c;让我回想起我刚工作时买的iPod。iPod确是惊艳之作&#xff0c;那时我一个月挣1000元&#xff0c;竟毫不犹豫花了2000就买了&#xff0c;并一直伴随我直到进入智能手机时代。《创造》会写什么&#xff1…

日志项目之——将kafka数据存入hbase中

目录 1.添加依赖 2.在hbase shell界面中分别输入下面的语句&#xff0c;创建namespace和表 3.UserFriendToHB 4.UsersToHB 5.TrainToHB 6.EventsToHB 7.EventAttendeToHb 1.添加依赖 <dependencies><dependency><groupId>junit</groupId><a…

软考信管高级——成本管理

成本管理内容 成本基准 成本基准是经过批准的&#xff0c;不包括管理储备&#xff0c;只有正式变更流程才能变更成本基准成本基准管理储备项目预算&#xff0c;有必要动用管理储备变更时&#xff0c;获变更批准后&#xff0c;把适量管理储备移入成本基准中 应急储备和管理储备…

Map接口以及Collections工具类

文章目录 1.Map接口概述1.1 Map的实现类的结构1.2 Map中存储的key-value结构的理解1.3 HashMap的底层实现原理(以JDK7为例)1.4 Map接口的常用方法1.5 TreeMap1.6 Map实现类之五: Properties 1.Collections工具类1.1方法1.1.1 排序操作(均为static方法)1.1.2 查找、替换 1.Map接…

PMP项目管理-[第八章]质量管理

质量管理知识体系&#xff1a; 规划质量管理&#xff1a; 管理质量&#xff1a; 控制质量 &#xff1a; 8.1 质量和等级的区别 质量定义&#xff1a;作为实现的性能或成果&#xff0c;是一系列内在特性满足要求的程度 等级定义&#xff1a;作为设计意图&#xff0c;是对用途相同…

Android 历代版本主要变化

这里只站在开发者的角度&#xff0c;谈论一下 Android 5.0 之后的版本的主要变化 Android 5.0 L 开始支持64位的处理器开始全面由 Dalvik 虚拟机转成ART虚拟机 Android 6.0 M 增加全新的动态权限机制&#xff08;运行时权限&#xff09;取消支持 Apache HTTP 客户端 Andro…

队列,双端队列,栈结构

java.util.Queue接口.队列 Queue继承自Collection. 队列可以保存一组元素,但是存取元素必须遵循先进先出原则:FIFO(First Input First Output) 常用实现类:LinkedList 双端队列 java.util.Deque Deque继承自Queue 双端队列是队列两端都可以做出入对操作的队列. 常用实现类…

适用于Win和Mac的专业电脑数据恢复软件EasyRecovery易恢复14

EasyRecovery易恢复一键轻松找回丢失数据 支持电脑、相机、移动硬盘、U盘、SD卡、内存卡、光盘、本地电子邮件和 RAID 磁盘阵列等各类存储设备的数据恢复。EasyRecovery还可以支持恢复从硬盘、光盘、U盘、数码相机、手机等各种设备中恢复被删除或丢失的文件&#xff0c;只是使用…